ViewModel;图片显示问题;触摸事件的拦截

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文件中


要点:

  • @BindingAdapter({"bind:imageUrl"})中的参数为数组,不过测试过如果只有一个参数的话不写{}也可以。
  • bind:为固定写法,不能改成别的
  • imageUrl是xml中的属性名。
  • 定义的方法必须为静态方法,第一参数为目标View,第二个参数为imageUrl对应的值
  • xml中实际使用的app:imageUrlbind:imageUrl不用一模一样,跟这个没关系。
  • xml中app:imageUrl="@{viewModel.imageUrl}"的值@{viewModel.imageUrl}必须为data binding的语法,不能直接写string之类的东西

你可能感兴趣的:(ViewModel;图片显示问题;触摸事件的拦截)