刮刮乐

/**
* Created by MarRn on 2016/6/29.
*/
public class ScrapeView extends View{

//被覆盖的内容图层
private Bitmap bpBackground;
//用来当做覆盖用的图层
private Bitmap bpForeground;
//用来当做覆盖用的图层的画布
private Canvas mCanvas;
//模拟手指头刮开路径的画笔
private Paint pathPaint;
//手指头刮开的路径
private Path path;

//用来当做覆盖用的图层的文字画笔
private Paint contentPaint;
//用来当做覆盖用的图层的文字内容
private String content = "刮刮看咯~";

public ScrapeView(Context context) {
    super(context);
    init();
}

public ScrapeView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

private void init(){

    //初始化模拟刮开路径的画笔
    pathPaint = new Paint();
    pathPaint.setAlpha(0);
    pathPaint.setStyle(Paint.Style.STROKE);
    pathPaint.setStrokeWidth(50);
    //取两层绘制交集,显示下层
    pathPaint.setXfermode(new PorterDuffXfermode((PorterDuff.Mode.DST_IN)));
    pathPaint.setStrokeJoin(Paint.Join.ROUND);
    pathPaint.setStrokeCap(Paint.Cap.ROUND);


    //初始化模拟手指头刮开的路径
    path = new Path();


    //初始化被覆盖的内容bitmap
    bpBackground = BitmapFactory.decodeResource(getResources(),R.drawable.test);
    //初始化用来当做覆盖用的bitmap
    bpForeground = Bitmap.createBitmap(bpBackground.getWidth(),bpBackground.getHeight(), Bitmap.Config.ARGB_8888);

    //初始化画布
    mCanvas = new Canvas(bpForeground);

    //初始化内容画笔
    contentPaint = new Paint();
    contentPaint.setColor(Color.WHITE);
    contentPaint.setTextSize(100);
    contentPaint.setStrokeWidth(20);

    //设置用来当做覆盖用的图层颜色为灰色
    mCanvas.drawColor(Color.GRAY);
    //在用来当做覆盖用的图层上绘制文字
    mCanvas.drawText(content,mCanvas.getWidth()/4,mCanvas.getHeight()/2,contentPaint);

}

@Override
public boolean onTouchEvent(MotionEvent event) {

    switch (event.getAction()){
        case MotionEvent.ACTION_DOWN:
            //清空画笔
            path.reset();
            //原点移动至手指的触摸点
            path.moveTo(event.getX(),event.getY());
            break;
        case MotionEvent.ACTION_MOVE:

            path.lineTo(event.getX(),event.getY());
            break;
    }

    //模拟刮来效果
    mCanvas.drawPath(path,pathPaint);
    invalidate();
    return true;

}

@Override
protected void onDraw(Canvas canvas) {

    //绘制两个图层
    canvas.drawBitmap(bpBackground,0,0,null);
    canvas.drawBitmap(bpForeground,0,0,null);

}

}

xml文件中的使用:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值