blob: 8e2c108c3598d19cc0f47f471ee1fb3579f75d73 [file] [log] [blame]
alisionfe9cf712013-05-03 17:26:08 -04001package com.savoirfairelinux.sflphone.model;
2
3import android.content.Context;
4import android.graphics.Bitmap;
5import android.graphics.BitmapFactory;
6import android.graphics.Canvas;
7import android.graphics.Paint;
8import android.graphics.Path;
Adrien Béraud25fc4092013-05-06 15:28:39 +10009import android.graphics.PointF;
alisionfe9cf712013-05-03 17:26:08 -040010import android.graphics.PorterDuff.Mode;
11import android.graphics.PorterDuffXfermode;
12import android.graphics.RectF;
alisionfe9cf712013-05-03 17:26:08 -040013
14import com.savoirfairelinux.sflphone.R;
15
Adrien Béraud04463092013-05-06 14:17:22 +100016public class Bubble
17{
Adrien Béraud04463092013-05-06 14:17:22 +100018 // A Bitmap object that is going to be passed to the BitmapShader
19 private Bitmap internalBMP, externalBMP;
alisionfe9cf712013-05-03 17:26:08 -040020
Adrien Béraud25fc4092013-05-06 15:28:39 +100021 private PointF pos = new PointF();
Adrien Béraud04463092013-05-06 14:17:22 +100022 private RectF bounds;
Adrien Béraud25fc4092013-05-06 15:28:39 +100023 private float radius;
alisionfe9cf712013-05-03 17:26:08 -040024
Adrien Béraud25fc4092013-05-06 15:28:39 +100025 public boolean dragged = false;
26 public PointF attractor = null;
alisionfe9cf712013-05-03 17:26:08 -040027
Adrien Béraud04463092013-05-06 14:17:22 +100028 public Bubble(Context c, float X, float Y, float rad, int resID) {
Adrien Béraud25fc4092013-05-06 15:28:39 +100029 pos.set(X, Y);
alisionfe9cf712013-05-03 17:26:08 -040030
Adrien Béraud04463092013-05-06 14:17:22 +100031 // Initialize the bitmap object by loading an image from the resources folder
Adrien Béraud25fc4092013-05-06 15:28:39 +100032 if (resID != -1)
Adrien Béraud04463092013-05-06 14:17:22 +100033 internalBMP = BitmapFactory.decodeResource(c.getResources(), resID);
Adrien Béraud25fc4092013-05-06 15:28:39 +100034 else
Adrien Béraud04463092013-05-06 14:17:22 +100035 internalBMP = BitmapFactory.decodeResource(c.getResources(), R.drawable.ic_contact_picture);
Adrien Béraud04463092013-05-06 14:17:22 +100036 internalBMP = Bitmap.createScaledBitmap(internalBMP, (int) rad, (int) rad, false);
37 int w = internalBMP.getWidth(), h = internalBMP.getHeight();
alisionfe9cf712013-05-03 17:26:08 -040038
Adrien Béraud04463092013-05-06 14:17:22 +100039 externalBMP = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
alisionfe9cf712013-05-03 17:26:08 -040040
Adrien Béraud04463092013-05-06 14:17:22 +100041 radius = externalBMP.getWidth() / 2;
Adrien Béraud25fc4092013-05-06 15:28:39 +100042 Path path = new Path();
alisionfe9cf712013-05-03 17:26:08 -040043
Adrien Béraud04463092013-05-06 14:17:22 +100044 path.addCircle(radius, radius, radius, Path.Direction.CW);
alisionfe9cf712013-05-03 17:26:08 -040045
Adrien Béraud25fc4092013-05-06 15:28:39 +100046 bounds = new RectF(pos.x - radius, pos.y - radius, pos.x + radius, pos.y + radius);
alisionfe9cf712013-05-03 17:26:08 -040047
Adrien Béraud25fc4092013-05-06 15:28:39 +100048 Paint mPaintPath = new Paint(Paint.ANTI_ALIAS_FLAG);
Adrien Béraud04463092013-05-06 14:17:22 +100049 mPaintPath.setStyle(Paint.Style.FILL);
50 mPaintPath.setAntiAlias(true);
51 Bitmap circle = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
52 Canvas circle_drawer = new Canvas(circle);
53 circle_drawer.drawOval(new RectF(0, 0, w, h), mPaintPath);
alisionfe9cf712013-05-03 17:26:08 -040054
Adrien Béraud04463092013-05-06 14:17:22 +100055 mPaintPath.setFilterBitmap(false);
Adrien Béraud25fc4092013-05-06 15:28:39 +100056
57 Canvas internalCanvas = new Canvas(externalBMP);
Adrien Béraud04463092013-05-06 14:17:22 +100058 internalCanvas.drawBitmap(internalBMP, 0, 0, mPaintPath);
59 mPaintPath.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
60 internalCanvas.drawBitmap(circle, 0, 0, mPaintPath);
61 }
alisionfe9cf712013-05-03 17:26:08 -040062
Adrien Béraud25fc4092013-05-06 15:28:39 +100063 public Bitmap getBitmap() {
64 return externalBMP;
65 }
66
67 public RectF getBounds() {
68 return bounds;
69 }
70
Adrien Béraud04463092013-05-06 14:17:22 +100071 public float getPosX() {
Adrien Béraud25fc4092013-05-06 15:28:39 +100072 return pos.x;
Adrien Béraud04463092013-05-06 14:17:22 +100073 }
alisionfe9cf712013-05-03 17:26:08 -040074
Adrien Béraud04463092013-05-06 14:17:22 +100075 public float getPosY() {
Adrien Béraud25fc4092013-05-06 15:28:39 +100076 return pos.y;
77 }
78
79 public void setPos(float x, float y) {
80 pos.x = x;
81 pos.y = y;
82 bounds.left = pos.x - radius;
83 bounds.right = pos.x + radius;
84 bounds.top = pos.y - radius;
85 bounds.bottom = pos.y + radius;
Adrien Béraud04463092013-05-06 14:17:22 +100086 }
alisionfe9cf712013-05-03 17:26:08 -040087
Adrien Béraud04463092013-05-06 14:17:22 +100088 public float getRadius() {
89 return radius;
90 }
Adrien Béraud25fc4092013-05-06 15:28:39 +100091
92 public PointF getPos()
93 {
94 return pos;
95 }
96
97 /**
98 * Point intersection test.
99 */
100 boolean intersects(float x, float y) {
101 float dx = x-pos.x, dy = y-pos.y;
102 return dx*dx + dy*dy < radius*radius;
103 }
104
105 /**
106 * Other circle intersection test.
107 */
108 boolean intersects(float x, float y, float radius) {
109 float dx = x-pos.x, dy = y-pos.y;
110 float tot_radius = this.radius + radius;
111 return dx*dx + dy*dy < tot_radius*tot_radius;
112 }
alisionfe9cf712013-05-03 17:26:08 -0400113}