自定义view
public class TestGuaGuaView extends View {
private Paint mPaint;
private Paint mPaint1;
private Path mPath;
private Bitmap mBitmap, mBitmap1;
private Canvas mCanvas;
private float startX, startY, newX, newY;
public TestGuaGuaView(Context context) {
super(context);
init(context);
}
public TestGuaGuaView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public TestGuaGuaView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.scenery).copy(Bitmap.Config.ARGB_8888, true);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(Color.WHITE);
mPaint1 = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint1.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
mPaint1.setStyle(Paint.Style.STROKE);
mPaint1.setStrokeWidth(10);
mPaint1.setAlpha(0);
mPath = new Path();
mBitmap1 = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap1);
mCanvas.drawColor(Color.BLACK);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.save();
canvas.drawBitmap(mBitmap, 0, 0, mPaint);
canvas.drawBitmap(mBitmap1, 0, 0, mPaint);
mCanvas.drawPath(mPath, mPaint1);
canvas.restore();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int type = event.getAction();
float x = event.getX();
float y = event.getY();
switch (type) {
case MotionEvent.ACTION_DOWN:
mPath.reset();
startX = x;
startY = y;
mPath.moveTo(startX, startY);
break;
case MotionEvent.ACTION_MOVE:
mPath.lineTo(x, y);
postInvalidate();
break;
case MotionEvent.ACTION_UP:
mPath.reset();
break;
default:
break;
}
return true;
}
}
重点
Xfermode和path