zoukankan      html  css  js  c++  java
  • 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);   
            }  
              
        }  
    }  
  • 相关阅读:
    苹果信息推送服务(Apple Push Notification Service)使用总结
    Xcode 相关路径总结
    微信红包随机算法 OC
    Xcode真机测试could not find developer disk image解决方法
    字典转模型 重写初始化方法
    Xcode 写代码没有补全提示解决:删缓存及显示隐藏文件命令
    按位与、或、异或等运算方法
    OC语言@property @synthesize和id
    iOS开发—Quartz2D简单介绍
    iOS开发—CoreLocation定位服务
  • 原文地址:https://www.cnblogs.com/Chenshuai7/p/5423486.html
Copyright © 2011-2022 走看看