本文通过一个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>