/
SharpImageView.java
105 lines (83 loc) · 3.32 KB
/
SharpImageView.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package com.zhaoxing.view.sharpview;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import com.rey.material.widget.ImageView;
import java.lang.ref.SoftReference;
/**
* Created by 曾宪梓 on 2018/6/23.
*/
public class SharpImageView extends ImageView implements SharpView{
private SoftReference<Bitmap> mSoftBitmap;
private SoftReference<Bitmap> mSoftOutBitmap;
private Canvas mCanvas;
private Canvas mOutCanvas;
private Paint mPaint = new Paint();
private Rect rect = new Rect();
private PorterDuffXfermode mPorterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
public SharpImageView(Context context) {
super(context);
init(context,null,0);
}
public SharpImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context,attrs,0);
}
public SharpImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context,attrs,defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
if (mSoftBitmap.get() == null || mSoftOutBitmap.get() == null) {
initBitmap();
}
mPaint.setAntiAlias(true);
mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
mOutCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
super.onDraw(mCanvas);
mPaint.setColor(Color.BLACK);
mSharpViewRenderProxy.mSharpDrawable.setBounds(0,0,getWidth(),getHeight());
mSharpViewRenderProxy.mSharpDrawable.setPaint(mPaint);
mSharpViewRenderProxy.mSharpDrawable.setBgColor(Color.BLACK);
mSharpViewRenderProxy.mSharpDrawable.draw(mOutCanvas);
mPaint.setXfermode(mPorterDuffXfermode);
mOutCanvas.drawBitmap(mSoftBitmap.get(), rect, rect, mPaint);
mPaint.setXfermode(null);
canvas.drawBitmap(mSoftOutBitmap.get(), rect, rect, mPaint);
}
private void init(Context context, AttributeSet attrs, int defStyleAttr){
mSharpViewRenderProxy = new SharpViewRenderProxy(this, context, attrs, defStyleAttr);
}
private SharpViewRenderProxy mSharpViewRenderProxy;
@Override
public SharpViewRenderProxy getRenderProxy() {
return mSharpViewRenderProxy;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (mSoftBitmap == null || w != oldw || h != oldh) {
initBitmap();
rect.set(0,0,getWidth(),getHeight());
}
}
private void initBitmap() {
Bitmap mBitmap = Bitmap.createBitmap(getWidth(),getHeight(), Bitmap.Config.ARGB_8888);
Bitmap mOutBitmap = Bitmap.createBitmap(getWidth(),getHeight(), Bitmap.Config.ARGB_8888);
mBitmap.setHasAlpha(true);
mOutBitmap.setHasAlpha(true);
mCanvas = new Canvas(mBitmap);
mOutCanvas = new Canvas(mOutBitmap);
mSoftBitmap = new SoftReference<>(mBitmap);
mSoftOutBitmap = new SoftReference<>(mOutBitmap);
}
}