Skip to content

Commit 5bec0ce

Browse files
author
miuyongjun
committed
更改版本
解决ANR
1 parent ece506a commit 5bec0ce

File tree

5 files changed

+89
-55
lines changed

5 files changed

+89
-55
lines changed

stickerview/build.gradle

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ android {
1010
defaultConfig {
1111
minSdkVersion 14
1212
targetSdkVersion 25
13-
versionCode 1
14-
versionName "1.0"
13+
versionCode 11
14+
versionName "1.1"
1515

1616
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1717

@@ -26,9 +26,6 @@ android {
2626

2727
dependencies {
2828
compile fileTree(dir: 'libs', include: ['*.jar'])
29-
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
30-
exclude group: 'com.android.support', module: 'support-annotations'
31-
})
3229
compile 'com.android.support:appcompat-v7:25.3.1'
3330
testCompile 'junit:junit:4.12'
3431
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package miaoyongjun.stickerview;
2+
3+
import android.graphics.Canvas;
4+
import android.graphics.Rect;
5+
import android.graphics.drawable.Drawable;
6+
import android.support.annotation.NonNull;
7+
8+
/**
9+
* Author: miaoyongjun
10+
* Date : 17/8/6
11+
*/
12+
13+
public class DrawableSticker extends Sticker {
14+
private Drawable drawable;
15+
private Rect realBounds;
16+
17+
public DrawableSticker(Drawable drawable) {
18+
this.drawable = drawable;
19+
realBounds = new Rect(0, 0, getWidth(), getHeight());
20+
init(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
21+
}
22+
23+
@Override
24+
public void draw(@NonNull Canvas canvas) {
25+
canvas.save();
26+
canvas.concat(getMatrix());
27+
drawable.setBounds(realBounds);
28+
drawable.draw(canvas);
29+
canvas.restore();
30+
}
31+
32+
@Override
33+
public int getWidth() {
34+
return drawable.getIntrinsicWidth();
35+
}
36+
37+
@Override
38+
public int getHeight() {
39+
return drawable.getIntrinsicHeight();
40+
}
41+
}

stickerview/src/main/java/miaoyongjun/stickerview/Sticker.java

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
package miaoyongjun.stickerview;
22

3-
import android.graphics.Bitmap;
3+
import android.graphics.Canvas;
44
import android.graphics.Matrix;
55
import android.graphics.Path;
6+
import android.support.annotation.NonNull;
7+
68
/**
79
* Author: miaoyongjun
810
* Date : 17/8/1
911
*/
1012

11-
public class Sticker {
13+
public abstract class Sticker {
1214

1315
private boolean init;
1416

1517
private Matrix matrix;
1618

17-
private Bitmap src;
18-
1919
private float[] srcPts;
2020

2121
private float[] dst;
@@ -27,30 +27,32 @@ public class Sticker {
2727
private float minStickerSize;
2828

2929

30-
Sticker(Bitmap src) {
31-
if (src == null) {
32-
throw new RuntimeException("the Sticker's src cannot be null");
33-
}
34-
this.src = src;
30+
public void init(int width, int height) {
3531
matrix = new Matrix();
3632

3733
srcPts = new float[]{0, 0, // 左上
38-
src.getWidth(), 0, // 右上
39-
src.getWidth(), src.getHeight(), // 右下
40-
0, src.getHeight()};
34+
width, 0, // 右上
35+
width, height, // 右下
36+
0, height};
4137
/*
4238
* 原始旋转效果的点 图片中心点和图片的右下角的点
4339
* 触摸时获取到触摸点以及和中心点形成另一组的点
4440
* 之后通过matrix.setPolyToPoly(src, 0, dst, 0, 2) 方法来获取变换后的matrix
4541
*/
4642
rotateSrcPts = new float[]{
47-
src.getWidth() / 2, src.getHeight() / 2,
48-
src.getWidth(), src.getHeight(),
43+
width / 2, height / 2,
44+
width, height,
4945
};
5046
dst = new float[8];
5147
boundPath = new Path();
5248
}
5349

50+
public abstract void draw(@NonNull Canvas canvas);
51+
52+
public abstract int getWidth();
53+
54+
public abstract int getHeight();
55+
5456
public float getMinStickerSize() {
5557
return minStickerSize;
5658
}
@@ -71,16 +73,8 @@ Matrix getMatrix() {
7173
return matrix;
7274
}
7375

74-
Bitmap getSrc() {
75-
return src;
76-
}
77-
7876
float getBitmapScale() {
79-
return src.getWidth() / (float) src.getHeight();
80-
}
81-
82-
public void setSrc(Bitmap src) {
83-
this.src = src;
77+
return getWidth() / (float) getHeight();
8478
}
8579

8680
float[] getDst() {

stickerview/src/main/java/miaoyongjun/stickerview/StickerView.java

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,18 @@
1313
import android.graphics.PointF;
1414
import android.graphics.RectF;
1515
import android.graphics.Region;
16+
import android.graphics.drawable.Drawable;
1617
import android.support.annotation.DrawableRes;
1718
import android.support.annotation.Nullable;
19+
import android.support.v4.content.ContextCompat;
1820
import android.support.v4.view.MotionEventCompat;
1921
import android.support.v7.widget.AppCompatImageView;
2022
import android.util.AttributeSet;
2123
import android.view.MotionEvent;
2224

2325
import java.util.ArrayList;
2426
import java.util.Collections;
27+
2528
/**
2629
* Author: miaoyongjun
2730
* Date : 17/8/1
@@ -30,22 +33,15 @@
3033
public 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
}

stickerview/src/main/res/values/attrs.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<resources>
33
<declare-styleable name="StickerView">
4-
<!--初始图片大小缩放比例 默认为0.5f 相对于view的宽度-->
4+
<!--初始图片大小缩放比例 默认为0.5f 相对于view的宽度 范围 0到1-->
55
<attr name="m_image_init_scale" format="float"/>
66
<!--贴纸的最大数量 默认为20个-->
77
<attr name="m_max_count" format="integer"/>
8-
<!--贴纸最小值的缩放比例 默认初始图片斜边的二分之一 根据宽度来定制-->
8+
<!--贴纸最小值的缩放比例 默认初始图片斜边的二分之一 根据宽度来定制 范围 0到1-->
99
<attr name="m_image_min_size_scale" format="float"/>
1010
<!--关闭按钮图标-->
1111
<attr name="m_close_icon" format="reference"/>
1212
<!--旋转按钮图标-->
1313
<attr name="m_rotate_icon" format="reference"/>
14-
<!--关闭按钮图标大小 默认15dp-->
14+
<!--关闭按钮图标大小 默认20dp-->
1515
<attr name="m_close_icon_size" format="dimension"/>
16-
<!--旋转按钮图标大小 默认15dp-->
16+
<!--旋转按钮图标大小 默认20dp-->
1717
<attr name="m_rotate_icon_size" format="dimension"/>
1818
<!--边框宽度 默认1dp-->
1919
<attr name="m_outline_width" format="dimension"/>

0 commit comments

Comments
 (0)