Android ——利用OnDraw实现自定义View(转)

自定义View的实现方式大概可以分为三种,自绘控件、组合控件、以及继承控件。本文将介绍自绘控件的用法。自绘控件的意思是,这个控件上的内容是用onDraw函数绘制出来的。关于onDraw函数的介绍可参看 Android视图绘制流程完全解析,带你一步步深入了解View(二) 。

例子1:在layout文件中使用自绘控件 

出处:http://blog.csdn.net/guolin_blog/article/details/17357967

 

下面我们准备来自定义一个计数器View,这个View可以响应用户的点击事件,并自动记录一共点击了多少次。新建一个CounterView继承自View,代码如下所示:

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();  
    }  
  
}  

可以看到,首先我们在CounterView的构造函数中初始化了一些数据,并给这个View的本身注册了点击事件,这样当CounterView被点击的时候,onClick()方法就会得到调用。而onClick()方法中的逻辑就更加简单了,只是对mCount这个计数器加1,然后调用invalidate()方法。通过 Android视图状态及重绘流程分析,带你一步步深入了解View(三) 这篇文章的学习我们都已经知道,调用invalidate()方法会导致视图进行重绘,因此onDraw()方法在稍后就将会得到调用。

 

在布局文件中加入如下代码:

<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> 

可以看到,这里我们将CounterView放入了一个RelativeLayout中。注意,自定义的View在使用的时候一定要写出完整的包名,不然系统将无法找到这个View。

例子2:通过实例化对象的方式使用自定义控件

出处:http://blog.csdn.net/ameyume/article/details/6031024

 

Android绘图操作,通过继承View实现,在onDraw函数中实现绘图。

下面是一个简单的例子:

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);   
        }  
          
    }  
}  

 

posted on 2016-04-23 01:22  Chen_s  阅读(2123)  评论(0编辑  收藏  举报

导航