Android入门教程 自定义View详解 真实案例
2016-06-16 17:04
851 查看
本文通过一个21点游戏的案例进行讲解自定义View,代码注释里有详细解释。
共包含三个文件,分别是
TwentyOneActivity.java
TwentyOneView.java
activity_twenty_one.xml
共包含三个文件,分别是
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>
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories