1313import android .graphics .PointF ;
1414import android .graphics .RectF ;
1515import android .graphics .Region ;
16+ import android .graphics .drawable .Drawable ;
1617import android .support .annotation .DrawableRes ;
1718import android .support .annotation .Nullable ;
19+ import android .support .v4 .content .ContextCompat ;
1820import android .support .v4 .view .MotionEventCompat ;
1921import android .support .v7 .widget .AppCompatImageView ;
2022import android .util .AttributeSet ;
2123import android .view .MotionEvent ;
2224
2325import java .util .ArrayList ;
2426import java .util .Collections ;
27+
2528/**
2629 * Author: miaoyongjun
2730 * Date : 17/8/1
3033public class StickerView extends AppCompatImageView {
3134
3235 private ArrayList <Sticker > mStickers ;
33-
3436 private Paint mStickerPaint ;
35-
3637 private Bitmap btnDeleteBitmap ;
37-
3838 private Bitmap btnRotateBitmap ;
39-
4039 private Sticker currentSticker ;
41-
42- private int maxStickerCount ;
43- private float minStickerSizeScale ;
44-
4540 private PointF lastPoint ;
46-
4741 private TouchState state ;
4842
43+ private int maxStickerCount ;
44+ private float minStickerSizeScale ;
4945 private float imageBeginScale ;
5046 private int closeIcon , rotateIcon ;
5147 private int closeSize , rotateSize ;
@@ -76,15 +72,14 @@ private void setAttributes(Context context, AttributeSet attrs) {
7672 minStickerSizeScale = typedArray .getFloat (R .styleable .StickerView_m_image_min_size_scale , 0.5f );
7773 closeIcon = typedArray .getResourceId (R .styleable .StickerView_m_close_icon , R .drawable .sticker_closed );
7874 rotateIcon = typedArray .getResourceId (R .styleable .StickerView_m_rotate_icon , R .drawable .sticker_rotate );
79- closeSize = typedArray .getDimensionPixelSize (R .styleable .StickerView_m_close_icon_size , dip2px (context , 15 ));
80- rotateSize = typedArray .getDimensionPixelSize (R .styleable .StickerView_m_rotate_icon_size , dip2px (context , 15 ));
75+ closeSize = typedArray .getDimensionPixelSize (R .styleable .StickerView_m_close_icon_size , dip2px (context , 20 ));
76+ rotateSize = typedArray .getDimensionPixelSize (R .styleable .StickerView_m_rotate_icon_size , dip2px (context , 20 ));
8177 outLineWidth = typedArray .getDimensionPixelSize (R .styleable .StickerView_m_outline_width , dip2px (context , 1 ));
8278 outLineColor = typedArray .getColor (R .styleable .StickerView_m_outline_color , Color .WHITE );
8379
8480 } finally {
8581 typedArray .recycle ();
8682 }
87-
8883 }
8984
9085 private void init (Context context ) {
@@ -110,18 +105,20 @@ private void init(Context context) {
110105
111106 }
112107
113- public boolean addSticker (@ DrawableRes int res ) {
114- Bitmap bitmap = BitmapFactory .decodeResource (getResources (), res );
115- return addSticker (bitmap );
116- }
117108
118- public boolean addSticker (Bitmap stickerBitmap ) {
109+ public boolean addSticker (@ DrawableRes int res ) {
119110 if (mStickers .size () >= maxStickerCount ) {
120111 return false ;
121112 }
122- Sticker bean = new Sticker (stickerBitmap );
123- mStickers .add (bean );
124- currentSticker = bean ;
113+ Drawable drawable =
114+ ContextCompat .getDrawable (getContext (), res );
115+ return addSticker (drawable );
116+ }
117+
118+ public boolean addSticker (Drawable drawable ) {
119+ DrawableSticker drawableSticker = new DrawableSticker (drawable );
120+ mStickers .add (drawableSticker );
121+ currentSticker = drawableSticker ;
125122 invalidate ();
126123 return true ;
127124 }
@@ -150,16 +147,21 @@ private void drawStickers(Canvas canvas) {
150147 float imageHeight = imageWidth / sticker .getBitmapScale ();
151148 float minSize = (float ) Math .sqrt (imageWidth * imageWidth + imageHeight * imageHeight );
152149 sticker .setMinStickerSize (minSize * minStickerSizeScale / 2 );
153- sticker .getMatrix ().postScale (imageWidth / sticker .getSrc (). getWidth (), imageWidth / sticker . getSrc () .getWidth ());
150+ sticker .getMatrix ().postScale (imageWidth / sticker .getWidth (), imageWidth / sticker .getWidth ());
154151 sticker .getMatrix ().postTranslate (
155152 (getMeasuredWidth () - imageWidth ) / 2 ,
156153 (getMeasuredHeight () - imageHeight ) / 2 );
157154 sticker .converse ();
158155 sticker .setInit (true );
159156 }
160- canvas . drawBitmap ( sticker .getSrc (), sticker . getMatrix (), null );
157+ sticker .draw ( canvas );
161158 if (sticker == currentSticker ) {
162- canvas .drawPath (sticker .getBoundPath (), mStickerPaint );
159+ //不能使用 drawPath 否则图片过大时会导致 Path too large to be rendered into a texture
160+ float [] dst = currentSticker .getDst ();
161+ canvas .drawLine (dst [0 ], dst [1 ], dst [2 ], dst [3 ], mStickerPaint );
162+ canvas .drawLine (dst [2 ], dst [3 ], dst [4 ], dst [5 ], mStickerPaint );
163+ canvas .drawLine (dst [4 ], dst [5 ], dst [6 ], dst [7 ], mStickerPaint );
164+ canvas .drawLine (dst [6 ], dst [7 ], dst [0 ], dst [1 ], mStickerPaint );
163165 drawBtn (sticker , canvas );
164166 }
165167 }
0 commit comments