Android(安卓)利用OnDraw实现自定义View
16lz
2021-01-25
自定义View的实现方式大概可以分为三种,自绘控件、组合控件、以及继承控件。本文将介绍自绘控件的用法。自绘控件的意思是,这个控件上的内容是用onDraw函数绘制出来的。关于onDraw函数的介绍可参看 Android视图绘制流程完全解析,带你一步步深入了解View(二) 。
例子1:在layout文件中使用自绘控件
出处:http://blog.csdn.net/guolin_blog/article/details/17357967
下面我们准备来自定义一个计数器View,这个View可以响应用户的点击事件,并自动记录一共点击了多少次。新建一个CounterView继承自View,代码如下所示:
[java] view plain copy- public class CounterView extends View implements OnClickListener {
- private Paint mPaint;
- private Rect mBounds;
- private int mCount;
- public CounterView(Context context, AttributeSet attrs) {
- super(context, attrs);
- mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- mBounds = new Rect();
- setOnClickListener(this);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- mPaint.setColor(Color.BLUE);
- canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
- mPaint.setColor(Color.YELLOW);
- mPaint.setTextSize(30);
- String text = String.valueOf(mCount);
- mPaint.getTextBounds(text, 0, text.length(), mBounds);
- float textWidth = mBounds.width();
- float textHeight = mBounds.height();
- canvas.drawText(text, getWidth() / 2 - textWidth / 2, getHeight() / 2
- + textHeight / 2, mPaint);
- }
- @Override
- public void onClick(View v) {
- mCount++;
- invalidate();
- }
- }
在布局文件中加入如下代码:
[html] view plain copy- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <com.example.customview.CounterView
- android:layout_width="100dp"
- android:layout_height="100dp"
- android:layout_centerInParent="true" />
- RelativeLayout>
例子2:通过实例化对象的方式使用自定义控件
出处:http://blog.csdn.net/ameyume/article/details/6031024
Android绘图操作,通过继承View实现,在onDraw函数中实现绘图。
下面是一个简单的例子:
[java] view plain copy
- public class AndroidTest extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- MyView mv = new MyView(this);
- setContentView(mv);
- }
- public class MyView extends View {
- MyView(Context context) {
- super(context);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- // TODO Auto-generated method stub
- super.onDraw(canvas);
- // 首先定义一个paint
- Paint paint = new Paint();
- // 绘制矩形区域-实心矩形
- // 设置颜色
- paint.setColor(Color.BLUE);
- // 设置样式-填充
- paint.setStyle(Style.FILL);
- // 绘制一个矩形
- canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint);
- // 绘空心矩形
- // 设置颜色
- paint.setColor(Color.RED);
- // 设置样式-空心矩形
- paint.setStyle(Style.STROKE);
- // 绘制一个矩形
- canvas.drawRect(new Rect(10, 10, 100, 30), paint);
- // 绘文字
- // 设置颜色
- paint.setColor(Color.GREEN);
- // 绘文字
- canvas.drawText("Hello", 10, 50, paint);
- // 绘图
- // 从资源文件中生成位图
- Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
- // 绘图
- canvas.drawBitmap(bitmap, 10, 60, paint);
- }
- }
- }
更多相关文章
- Android中给系统控件添加配置的自定义属性
- Android(安卓)Studio中Button等控件的Text属性英文默认大写的解
- android EditText处理焦点问题和键盘收起问题
- Android(安卓)动态获取控件的宽高,并动态设置控件宽高
- Android的SurfaceView使用
- android:JNI与Android(安卓)VM之关系
- Android——智能指针
- Android万能下拉刷新,上拉加载。支持自定义样式!!!
- Android(安卓)TextView实现逐字动画