关于View和滑动的一些总结

View的位置参数

  View中有四个基本的位置参数,分别是left,right,top,bottom。分别代表View的左上角横坐标,右上角横坐标,左上角纵坐标,右下角纵坐标。这四个参数都是相对父容器来说的。View有一个获得宽高的方法:getWidth()和getHeight(),其内部实现就是width=right-left,height = bottom-top。并且这四个属性的赋值是在layout方法中。
  android 3.0开始给View新增了几个位置参数:x,y,translationX,translationY。其中x,y代表View左上角的坐标,translationX和translationY代表View相对父容器的偏移量,其初始值是0。
  在View平移的过程中,top,left,right,bottom表示的还是原始左上角的位置信息,值不会改变。改变的是x,y,translationX,translationY。有如下公式:

x = left + translationX

ScrollBy和ScrollTo

  ScrollBy和ScrollTo可以用来实现View的滑动,不过根据我的理解,这种方式只能移动“画框”。有其局限性。
例如有如下代码:

    FrameLayout viewById = (FrameLayout) findViewById(R.id.frame1);
    viewById.scrollBy(-50,-50);

这里写图片描述
  如上图,在执行scrollBy方法之前,是上图状态。
这里写图片描述
  执行之后的状态如上图,在ScrollBy之前,灰色框左上角相当于mScrollX = 0,mScrollY = 0。而scrollBy(-50,-50)相当于把“相框”往负方向移50。但是framLayout里面的布局没变。scrollTo同理。


动画

  用动画实现滑动比较简单,有补间动画和属性动画可供选择。两者的区别是补间动画并不是真正的移动,动画执行完成后控件还在原地。而属性动画则是控件真正的移动,因为是在改变其属性。
  补间动画的使用方法如下:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    >
       <translate
           android:duration="2000"
           android:fromXDelta="0"
           android:toXDelta="300"
           android:fromYDelta="0"
           android:toYDelta="300"/>
</set>


Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.trans1);
tv1.startAnimation(animation);

  或者用代码创建:

        TranslateAnimation translateAnimation = new TranslateAnimation(0,200,0,200);
        translateAnimation.setFillAfter(true);
        translateAnimation.setDuration(3000);
        tv1.startAnimation(translateAnimation);

  属性动画的使用方式就不再介绍了。


改变LayoutParamas位置参数

  通过改变LayoutParamas位置参数也可以实现滑动:

        ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) tv1.getLayoutParams();
        layoutParams.leftMargin+=100;
        tv1.setLayoutParams(layoutParams);
        tv1.requestLayout();

  实现平滑滑动如下:

final ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) tv1.getLayoutParams();
        final long l = System.currentTimeMillis();
        Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                layoutParams.leftMargin+=1;
                tv1.setLayoutParams(layoutParams);
                tv1.requestLayout();
                if(System.currentTimeMillis()-l<10000){
                    sendEmptyMessageDelayed(0,50);
                }
            }
        };
        handler.sendEmptyMessage(0);

总结

scrollTo/scrollBy适合用于整体内容的滑动。
动画适合用于没有交互的View(考虑到兼容,非属性动画实现交互很麻烦)和实现复杂效果。
改变布局参数实现起来稍微麻烦一些,但适合有交互的滑动。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值