Android入门教程 自定义View详解 真实案例

本文通过一个21点游戏的案例进行讲解自定义View,代码注释里有详细解释。
共包含三个文件,分别是
TwentyOneActivity.java
TwentyOneView.java
activity_twenty_one.xml

Activity类,TwentyOneActivity.java

public class TwentyOneActivity extends Activity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_twenty_one);
    }
}

自定义View类,TwentyOneView.java

public class TwentyOneView extends View {
    // 画笔
    private Paint paint = new Paint();
    private String text = "READY";
    // 随机数
    private int randomNum = 1;
    // 总点数
    private int sum = 0;

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

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint.setAntiAlias(true);
        //设置填充模式
        paint.setStyle(Paint.Style.FILL);
        // 设置渐变色
        // 参数解释
        // 1、渐变色起始X坐标
        // 2、渐变色起始Y坐标
        // 3、渐变色结束X坐标
        // 4、渐变色结束Y坐标
        // 5、渐变色颜色数组
        // 6、颜色数组里颜色的相对位置,如果是null,那就是均匀分布,通常设置为null就可以
        // 7、覆盖方式 如:重复、镜面等
        Shader shader = new LinearGradient(getWidth() / 2, getHeight() / 4, getWidth() / 2, getHeight() * 0.75f,
                new int[] { getResources().getColor(R.color.light_blue_circle),
                        getResources().getColor(R.color.blue_circle) },
                null, Shader.TileMode.REPEAT);
        paint.setShader(shader);
        //画圆饼(内有填充)
        //参数解释
        //1、起始位置X坐标
        //2、起始位置Y坐标
        //3、半径
        //4、画笔
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 4, paint);
        // 取消渐变色
        paint.setShader(null);
        //设置画笔颜色为白色
        paint.setColor(Color.WHITE);
        // 设置笔触粗细
        paint.setStrokeWidth(10);
        // 设置不填充,只画轮廓
        paint.setStyle(Paint.Style.STROKE);
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 4, paint);
        // 设置字体大小
        paint.setTextSize(100);
        //设置填充
        paint.setStyle(Paint.Style.FILL);
        //写字
        canvas.drawText(text, getWidth() / 2 - (text.length() * 30), getHeight() / 2 + 30, paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // 得到随机数
            randomNum = getRandom();
            sum = sum + randomNum;
            if (sum > 21) {
                text = "炸了!";
                invalidate();
                // 炸了之后,游戏重新开始
                sum = 0;
            } else {
                text = randomNum + "";
                invalidate();
            }
            break;
        default:
            break;
        }
        return super.onTouchEvent(event);
    }

    /**
     * 得到一个1~13的随机数
     * 
     * @return
     */
    private int getRandom() {
        int a = (int) (Math.random() * 14);
        if (a == 0) {
            return getRandom();
        }
        return a;
    }

}

布局文件,activity_twenty_one.xml

<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:background="#4d5b52"
    tools:context="${relativePackage}.${activityClass}" >

    <com.lenovo.view.TwentyOneView
        android:id="@+id/twentyone"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_world" />

</RelativeLayout>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值