Android开发笔记之自定义View

刮刮卡奖的实现

这里写图片描述
实现效果如图所示


我们自定义一个CardView
让其继承View,代码如下

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.os.Build;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

import java.util.Random;

/**
 * Created by user on 2016/7/6.
 */
public class CardView extends View{
    private Random random;
    private Paint paint;
    private Paint clearPaint;
    private static final String[] PRIZE = {"一等奖","二等奖","三等奖","再来一次"};
    private static final int FINGER = 50;
    private Bitmap bitmapBuffer;
    private Canvas canvasBuffer;
    private int curX,curY;

    public CardView(Context context, AttributeSet attrs) {
        super(context, attrs);
        random = new Random();//用来随机抽取几等奖
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);//画笔
        paint.setTextSize(120);//设置字体的大小
        paint.setColor(Color.BLACK);//设置字体的颜色,中奖字体的颜色
        clearPaint = new Paint(Paint.ANTI_ALIAS_FLAG);//清除画笔,用来刮开刮奖区
        clearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));//设置模式
        clearPaint.setStrokeJoin(Paint.Join.ROUND);
        clearPaint.setStrokeCap(Paint.Cap.ROUND);
        clearPaint.setStrokeWidth(FINGER);
        drawBackground();
    }

----------


    protected void onSizeChanged(int w,int h,int oldw,int oldh){
        super.onSizeChanged(w,h,oldw,oldh);
        bitmapBuffer = Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
        canvasBuffer = new Canvas(bitmapBuffer);
        canvasBuffer.drawColor(Color.parseColor("#ff808080"));
    }
    private int getPrizeIndex(){
        return random.nextInt(PRIZE.length);
    }
    private void drawBackground() {
        Bitmap bitmapbackground = BitmapFactory.decodeResource(getResources(),R.drawable.background);
        Bitmap bitmapBackgroundMutable = bitmapbackground.copy(Bitmap.Config.ARGB_8888,true);
        Canvas canvasBack = new Canvas(bitmapBackgroundMutable);
        String text = PRIZE[getPrizeIndex()];
        Rect rect =new Rect();
        paint.getTextBounds(text,0,text.length(),rect);
        int x = (bitmapBackgroundMutable.getWidth()-rect.width())/2;
        int y = (bitmapBackgroundMutable.getHeight()-rect.height())*4/5;
        this.setLayerType(View.LAYER_TYPE_SOFTWARE,paint);
        paint.setStrokeWidth(5);
        paint.setShadowLayer(10,0,0,Color.BLACK);
        canvasBack.drawText(text,x,y,paint);
        paint.setShadowLayer(0,0,0,Color.YELLOW);
        if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.JELLY_BEAN) {
            this.setBackground(new BitmapDrawable(getResources(),bitmapBackgroundMutable));
        }else {
            this.setBackground(new BitmapDrawable(bitmapBackgroundMutable));
        }
    }
    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);
        canvas.drawBitmap(bitmapBuffer,0,0,paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int x = (int) event.getX();
        int y = (int) event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                curX = x;
                curY = y;
                break;
            case MotionEvent.ACTION_MOVE:
                canvasBuffer.drawLine(curX,curY,x,y,clearPaint);
                invalidate();
                curX = x;
                curY = y;
                break;
            case MotionEvent.ACTION_UP:
                invalidate();
                break;
            default:
                break;
        }
        return true;
    }
}

自定义的view的代码就是上面所示,我们只要在布局中引进这个自定义view就可以,主布局的代码非常的简单,如下所示

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.xxxxxx.xxxx.flowering.MainActivity">

    <com.lanou.songxuehu.flowering.CardView
        android:layout_width="wrap_content"
        android:layout_height="200dp"
         />
</RelativeLayout>


----------
主函数中什么也不用写,直接运行就可以
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值