您的位置:首页 > 产品设计 > UI/UE

一步步搞定自定义VIEW(一)

2017-01-28 11:34 141 查看
在新的一年里要有个漂亮的重生,继续在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);
}
}


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical">
<com.example.administrator.testview.MyView
android:id="@+id/myview"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>


效果为下图:



这个例子说明了什么?

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。所以为什么是全屏。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ANDROID-UI