blob: 41dc4bc0e07b89a54caa3fc25f910e91e9e52e8c [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;
Adrien Béraude0ef0c22013-05-18 01:56:27 +100024 public PointF speed = new PointF(0, 0);
25 public PointF last_speed = new PointF();
Adrien Béraud25fc4092013-05-06 15:28:39 +100026 public PointF attractor = null;
alisionfe9cf712013-05-03 17:26:08 -040027
Adrien Béraude0ef0c22013-05-18 01:56:27 +100028 public boolean dragged = false;
29 public long last_drag;
alision4a0eb092013-05-07 13:52:03 -040030
Adrien Béraude0ef0c22013-05-18 01:56:27 +100031
32 public void setAttractor(PointF attractor) {
33 this.attractor = attractor;
34 }
35
Adrien Béraud33268882013-05-18 03:41:15 +100036 public Bubble(Context c, float x, float y, float rad, Bitmap photo) {
37 internalBMP = photo;
Adrien Béraude0ef0c22013-05-18 01:56:27 +100038 pos.set(x, y);
alisionfe9cf712013-05-03 17:26:08 -040039
Adrien Béraud04463092013-05-06 14:17:22 +100040 internalBMP = Bitmap.createScaledBitmap(internalBMP, (int) rad, (int) rad, false);
41 int w = internalBMP.getWidth(), h = internalBMP.getHeight();
alisionfe9cf712013-05-03 17:26:08 -040042
Adrien Béraud04463092013-05-06 14:17:22 +100043 externalBMP = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
alisionfe9cf712013-05-03 17:26:08 -040044
Adrien Béraud04463092013-05-06 14:17:22 +100045 radius = externalBMP.getWidth() / 2;
Adrien Béraud25fc4092013-05-06 15:28:39 +100046 Path path = new Path();
alisionfe9cf712013-05-03 17:26:08 -040047
Adrien Béraud04463092013-05-06 14:17:22 +100048 path.addCircle(radius, radius, radius, Path.Direction.CW);
alisionfe9cf712013-05-03 17:26:08 -040049
Adrien Béraud25fc4092013-05-06 15:28:39 +100050 bounds = new RectF(pos.x - radius, pos.y - radius, pos.x + radius, pos.y + radius);
alisionfe9cf712013-05-03 17:26:08 -040051
Adrien Béraud25fc4092013-05-06 15:28:39 +100052 Paint mPaintPath = new Paint(Paint.ANTI_ALIAS_FLAG);
Adrien Béraud04463092013-05-06 14:17:22 +100053 mPaintPath.setStyle(Paint.Style.FILL);
54 mPaintPath.setAntiAlias(true);
55 Bitmap circle = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
56 Canvas circle_drawer = new Canvas(circle);
57 circle_drawer.drawOval(new RectF(0, 0, w, h), mPaintPath);
alisionfe9cf712013-05-03 17:26:08 -040058
Adrien Béraude0ef0c22013-05-18 01:56:27 +100059 attractor = new PointF(x, y);
Adrien Béraud04463092013-05-06 14:17:22 +100060 mPaintPath.setFilterBitmap(false);
Adrien Béraud25fc4092013-05-06 15:28:39 +100061
62 Canvas internalCanvas = new Canvas(externalBMP);
Adrien Béraud04463092013-05-06 14:17:22 +100063 internalCanvas.drawBitmap(internalBMP, 0, 0, mPaintPath);
64 mPaintPath.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
65 internalCanvas.drawBitmap(circle, 0, 0, mPaintPath);
66 }
alisionfe9cf712013-05-03 17:26:08 -040067
Adrien Béraud33268882013-05-18 03:41:15 +100068 public Bubble(Context c, float x, float y, float rad, int resID) {
69 // Initialize the bitmap object by loading an image from the resources folder
70 /*if (resID != -1)
71 internalBMP = BitmapFactory.decodeResource(c.getResources(), resID);
72 else
73 internalBMP = BitmapFactory.decodeResource(c.getResources(), R.drawable.ic_contact_picture);
74 */
75 this(c, x, y, rad, BitmapFactory.decodeResource(c.getResources(), resID==-1 ? resID : R.drawable.ic_contact_picture));
76 }
77
78
79
Adrien Béraud25fc4092013-05-06 15:28:39 +100080 public Bitmap getBitmap() {
81 return externalBMP;
82 }
83
84 public RectF getBounds() {
85 return bounds;
86 }
87
Adrien Béraud04463092013-05-06 14:17:22 +100088 public float getPosX() {
Adrien Béraud25fc4092013-05-06 15:28:39 +100089 return pos.x;
Adrien Béraud04463092013-05-06 14:17:22 +100090 }
alisionfe9cf712013-05-03 17:26:08 -040091
Adrien Béraud04463092013-05-06 14:17:22 +100092 public float getPosY() {
Adrien Béraud25fc4092013-05-06 15:28:39 +100093 return pos.y;
94 }
95
96 public void setPos(float x, float y) {
97 pos.x = x;
98 pos.y = y;
99 bounds.left = pos.x - radius;
100 bounds.right = pos.x + radius;
101 bounds.top = pos.y - radius;
102 bounds.bottom = pos.y + radius;
Adrien Béraud04463092013-05-06 14:17:22 +1000103 }
alisionfe9cf712013-05-03 17:26:08 -0400104
Adrien Béraud04463092013-05-06 14:17:22 +1000105 public float getRadius() {
106 return radius;
107 }
Adrien Béraud25fc4092013-05-06 15:28:39 +1000108
109 public PointF getPos()
110 {
111 return pos;
112 }
113
114 /**
115 * Point intersection test.
116 */
117 boolean intersects(float x, float y) {
118 float dx = x-pos.x, dy = y-pos.y;
119 return dx*dx + dy*dy < radius*radius;
120 }
121
122 /**
123 * Other circle intersection test.
124 */
125 boolean intersects(float x, float y, float radius) {
126 float dx = x-pos.x, dy = y-pos.y;
127 float tot_radius = this.radius + radius;
128 return dx*dx + dy*dy < tot_radius*tot_radius;
129 }
alisionfe9cf712013-05-03 17:26:08 -0400130}