1.ViewModel的模式有点像ReactNative的状态机
一个视图单元(比如说一个Activity和若干个下属Fragment)共享一个ViewModel,这个ViewModel记载了所有的状态,只要往这个状态机里更新数据,视图就会自动更新,这样就省去了在视图之间传递数据的麻烦。
2.图片显示问题
如果发现图片显示不正常,变扁或者怎么的,考虑scaleType这个属性
3.触摸事件的拦截
有3个相关的方法分别是ViewGroup的
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
View的
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
ViewGroup比View多了个intercept相关的方法,一开始对这些方法的返回值很迷惑,搞不懂返回true或者false到底代表着什么,返回哪个会把事件传递下去或者返回上层,之后看了一个教程,弄明白了,这几个方法的返回值的意思是,true->这一层会消费这个事件,不往下(上)传递(回传);false->这一层不消费这个事件,往下(上)传递(回传)。调用顺序是dispatchTouchEvent->onInterceptTouchEvent->onTouchEvent,其中任何一环返回了true都将导致事件被拦截,返回false则按
Activity -> PhoneWindow -> DecorView -> ViewGroup -> ... -> View
->
Activity <- PhoneWindow <- DecorView <- ViewGroup <- ... <- View
的责任链传递。
4.DataBinding在xml文件中加载图片
参考文章
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0930/3536.html
主要两步:
随便哪个Java文件中,我自己的写法是写在ViewModel中
@BindingAdapter({"bind:imageUrl"})
public static void loadImage(ImageView view, String imageUrl) {
Picasso.with(view.getContext())
.load(imageUrl)
.placeholder(R.drawable.placeholder)
.into(view);
}
xml文件中
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
app:imageUrl="@{viewModel.imageUrl}" />
要点:
- @BindingAdapter({"bind:imageUrl"})中的参数为数组,不过测试过如果只有一个参数的话不写
{}
也可以。 -
bind:
为固定写法,不能改成别的 -
imageUrl
是xml中的属性名。 - 定义的方法必须为静态方法,第一参数为目标View,第二个参数为imageUrl对应的值
- xml中实际使用的
app:imageUrl
跟bind:imageUrl
不用一模一样,跟这个没关系。 - xml中
app:imageUrl="@{viewModel.imageUrl}
"的值@{viewModel.imageUrl}
必须为data binding的语法,不能直接写string之类的东西
网友评论