一步步搞定自定义VIEW(一)
2017-01-28 11:34
141 查看
在新的一年里要有个漂亮的重生,继续在ANDROID的海洋中探索吧。多如牛毛的知识点,能积累一点是一点,大年初一写写东西,梳理下以前所学知识。转行是个痛苦的事情,也没多少人支持和理解,当你受到打击时,身边的人也会失去信心,只能是自己给自己打气,快点度过这段黑暗的时光。
说正事,如何自定义VIEW,写个简单的例子,上代码
效果为下图:
这个例子说明了什么?
1.继承VIEW
2.在XML中添加,属性为wrap_content。
3.在第二个构造函数中初始化。
这不是个完整的的自定义VIEW,里面只重写了ondraw,没有重写onmeasure,也没有在xml中添加自定义属性。因为宽高是wrap_content,显示的效果就是全屏,如果要给出特定的宽高,就必须重写onmeasure。
我们来看看为什么。
这段是VIEW的onmeasure方法,最终结果便是setMeasuredDimension这个方法确定,你可以设定任意值,比如说setMeasuredDimension(100,100),这样大小就是100*100。
从上面代码可以看出specMode为MeasureSpec.UNSPECIFIED的时候,也就是wrap_content的时候,给的是size,也就是默认值,来看看这个值是多少。
这下就真相大白了,默认的是MATCH_PARENT。所以为什么是全屏。
说正事,如何自定义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。所以为什么是全屏。
相关文章推荐
- 自定义VIEW中的XML文件解析过程
- 补间动画调用了VIEW哪些函数?
- 自定义VIEW中区域点击事件
- CANVAS 的座标
- 关于自定义view中处理事件的探索(一)
- 跟随手指的小球
- Android仿小米商城底部导航栏(基于BottomNavigationBar)
- Android 自定义视图总结
- android高级工程师应该会的知识
- 知乎和简书的夜间模式实现套路
- Android新特性、新组件及当前较潮流的设计Demo集合——Android Material Design
- Android 内存泄漏总结
- 类似网易评论UI
- RecyclerView初步试用(一)
- 打造自动播放动画,实现PPt模式的效果
- listview+checkbox 在一个页面点击checkbox,滑动到另一个页面也有 listview条目复制
- XUI设计
- Android 底部导航栏(底部Tab)最佳实践
- 不跟随手指的小球--OnGestureListener和SCROLLER的使用
- RecyclerView的简单使用