View的滑动冲突
一简单场景下(如:水平滑动里面嵌套一层垂直滑动)解决办法很多,这里记一个方法。通过水平滑动的距离dx与垂直滑动的距离dy的大小来判断是水平还是垂直滑动。通常有外部拦截跟内部拦截,外部拦截即重写父容器的onInterceptTouchEvent,而内部拦截即重写子元素的dispatchTouchEvent,并根据具体情况将逻辑返回给父容器的onInterceptTouchEvent.因外部拦截法较内部拦截法更为简单,所以推荐使用外部拦截法解决滑动冲突。
View的工作流程
1.Measure,layout,draw。Measure确定测量的宽高,layout确定view的最终宽高跟四个顶点,draw将view绘制到屏幕。其中view的measure方法是final方法,子类不可重写,而viewgroup的measure可以重写。Margin属性是父容器控制,而padding属性自定义view自己控制,所以设置前padding属性需重写。步骤如下:
在onDraw方法中
int paddingLeft=getPaddingLeft();
int paddingRight=getPaddingRight();
int paddingTop=getPaddingTop();
int paddingBottom=getPaddingBottom();
使用前将padding值添加到自定义view中即可。
2.为自定义view添加自定义属性步骤:
2.1 在values目录下创建xml文件 如attrs.xml
2.2
<?xml version="1.0" enco ding="utf-8"?>
<resources>
<declare-styleable name="circleview">
<attr name="circle_color" format="color"></attr>
</declare-styleable>
</resources>
2.3在自定义view的构造方法中添加
TypedArray array=context.obtainStyledAttributes(attrs, R.styleable.circleview);
mColor=array.getColor(R.styleable.circleview_circle_color, Color.RED);
array.recycle();
2.4在xml中应用
必须先引入 xmlns:app=http://schemas.android.com/apk/res-auto
<com.example.androidstepdemo.view.CircleView
android:layout_width="match_parent"
android:layout_height="180dp"
android:background="#000000"
android:padding="20dp"
app:circle_color="#f2f2f2"
/>
其中 app可以换成用户自己定义的变量名