首页 > 程序开发 > 移动开发 > 其他 >

安卓开发之搞定自定义VIEW(一)

2017-02-06

安卓开发之搞定自定义VIEW(一):在新的一年里要有个漂亮的重生,继续在ANDROID的海洋中探索吧。多如牛毛的知识点,能积累一点是一点,大年初一写写东西,梳理下以前所学知识。

安卓开发之搞定自定义VIEW(一):在新的一年里要有个漂亮的重生,继续在ANDROID的海洋中探索吧。多如牛毛的知识点,能积累一点是一点,大年初一写写东西,梳理下以前所学知识。

转行是个痛苦的事情,也没多少人支持和理解,当你受到打击时,身边的人也会失去信心,只能是自己给自己打气,快点度过这段黑暗的时光。
说正事,如何自定义VIEW,写个简单的例子,上代码

public class MyView extends View {

    private Paint paint;

    public MyView(Context context) {
        super(context);
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
        paint.setColor(Color.RED);
    }

    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(getWidth()/2,getHeight()/2,200,paint);
    }
}
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}



效果为下图:

这个例子说明了什么?
1.继承VIEW
2.在XML中添加,属性为wrap_content。
3.在第二个构造函数中初始化。

这不是个完整的的自定义VIEW,里面只重写了ondraw,没有重写onmeasure,也没有在xml中添加自定义属性。因为宽高是wrap_content,显示的效果就是全屏,如果要给出特定的宽高,就必须重写onmeasure。
我们来看看为什么。

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
    }

这段是VIEW的onmeasure方法,最终结果便是setMeasuredDimension这个方法确定,你可以设定任意值,比如说setMeasuredDimension(100,100),这样大小就是100*100。

public static int getDefaultSize(int size, int measureSpec) {
        int result = size;

        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);

        switch (specMode) {
        case MeasureSpec.UNSPECIFIED:
            result = size;
            break;
        case MeasureSpec.AT_MOST:
        case MeasureSpec.EXACTLY:
            result = specSize;
            break;
        }
        return result;
    }

从上面代码可以看出specMode为MeasureSpec.UNSPECIFIED的时候,也就是wrap_content的时候,给的是size,也就是默认值,来看看这个值是多少。

 protected int getSuggestedMinimumWidth() {
        return (mBackground == null) ? mMinWidth : max(mMinWidth, mBackground.getMinimumWidth());
    }

    protected int getSuggestedMinimumHeight() {
        return (mBackground == null) ? mMinHeight : max(mMinHeight, mBackground.getMinimumHeight());

    }

这下就真相大白了,默认的是MATCH_PARENT。所以为什么是全屏。

相关文章
最新文章
热点推荐