标签:XML 如何 war pre 视图 定义 固定 example 返回
这篇文章以简单的方式说明怎么去自定义View至于源码的分析,在后面总结再写吧。
Android 自定义View的流程:
如果子类想要自定义测量过程,则子类需要重写onMeasure方法。如下我们写一个MyView类继承View:
public class MyView extends View{ public MyView(Context context, AttributeSet attrs) { super(context, attrs); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }
可以看到onMeasure接受两个参数 widthMeasureSpec,heightMeasureSpec ,显然这就是View的width和height。widthMeasureSpec,heightMeasureSpec是一个32位的整形值,其中高2位为测量模式SpecMode,低30位表示某种测量模式下的规格大小SpecSize。后缀MeasureSpec是View类的一个静态内部类,用来说明应该如何测量这个View。
测量模式分为三种:
我们如何获得测量模式和测量大小呢?
//获取测量模式 int specMode = MeasureSpec.getMode(measureSpec); //获取测量大小 int specSize = MeasureSpec.getSize(measureSpec);
View类默认的onMeasure()方法只支持EXACTLY模式,如果你不重写该方法,引入控件时属性设置为wrap_content,是不会生效的,而是自动采用match_parent。
onMeasure()方法中,我们可以通过setMeasureDimension(int width,int height)传入我们想要的宽和高,如果我们自定义View时不重写该方法,则默认会直接调用getDefaultSize()来获得View的宽和高。。
下面我们看一个简单的实例:
import android.content.Context; import android.util.AttributeSet; import android.view.View; public class MyView extends View{ public MyView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ //super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(measure(widthMeasureSpec),measure(heightMeasureSpec)); } /** * 完全自己自定义的方法哦,你甚至可以让不管设置什么都返回固定大小! * @param measureSpec 传入的measureSpec * @return 处理后的大小 */ private int measure(int measureSpec){ int result = 0; //分别获取测量模式 和 测量大小 int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); //如果是精确度模式,呢就按xml中定义的来 if(specMode == MeasureSpec.EXACTLY){ result = specSize; } //如果是最大值模式,就按我们定义的来 else if(specMode == MeasureSpec.AT_MOST){ result = 200; } return result; } }
在XML中引用MyView
<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" tools:context="com.example.app.MainActivity" > <com.example.app.MyView android:layout_width="400px" android:layout_height="wrap_content" android:background="#ff0000" /> </RelativeLayout>
标签:XML 如何 war pre 视图 定义 固定 example 返回
原文地址:http://www.cnblogs.com/wangcMove/p/7063979.html