参考资料:http://liuwangshu.cn/application/view/2-sliding.html

平移方法总结

建议将View移动前后的getLeft、getRight、getX、getY的参数打印出来,对比变化。

private void print(View view){
        int left = view.getLeft();
        int right = view.getRight();
        float x = view.getX();
        float y = view.getY();
        Log.d(TAG, "left: " + left + ",right = " + right + ",x = " + x + ",y = " + y);
    }
平移方法1:setTranslationX与setTranslationY

View的位置变化

setTranslationX后,getLeft()不变,getX()会变。

恢复方法是setTranslationX(0),而不是上一次偏移量的相反数。

tvTest.setTranslationX(tvTest.getTranslationX() + 200);

平移方法2:layout

View的layout方法会改变View的边界的绝对位置,View的尺寸也就随之变化了,如果不想改变尺寸,只想改变位置,则left与right,top与bottom的增量应该方向相同大小相等。

layout之后,getLeft()、getX()都会变化。

layout(getLeft()+offsetX, getTop()+offsetY,
            getRight()+offsetX , getBottom()+offsetY);
平移方法3:offsetLeftAndRight与offsetTopAndBottom

仅View的位置变化,offset为正则x轴正向移动。

offset之后,getLeft()、getRight()、getX()都会变化,但是View原有的尺寸不会变化。

tvTest.offsetLeftAndRight(-200);

平移方法4:layoutParams

仅View的位置变化

TODO:第一次setLayoutParams之后,View的getLeft、getX等参数并没有变化,但是View的位置确实变化了。后面再setLayoutParams,getLeft()、getRight()、getX()都会变化。

 ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) tvTest.getLayoutParams();
        layoutParams.leftMargin = layoutParams.leftMargin + (-200);
        tvTest.setLayoutParams(layoutParams);
平移方法5:动画

View的位置变化了,但是点击的位置不变(补间动画)。

getLeft、getX等参数均不变化

终于明白了为什么View的位置挪动了,原来的位置还能点击,因为点击对象是根据点击坐标计算检索出来的。

Animation animation = AnimationUtils.loadAnimation(this, R.anim.translate);
        animation.setFillAfter(true);
        tvTest.startAnimation(animation);
平移方法6:scollTo与scollBy

scollTo、scollBy移动的是View的内容,如果在ViewGroup中使用则是移动他所有的子View。

getLeft、getX等参数均不变化

平移方法7:Scroller

用法:http://liuwangshu.cn/application/view/2-sliding.html
源码:http://liuwangshu.cn/application/view/4-scroller-sourcecode.html

分类: view体系

0 条评论

发表回复

您的电子邮箱地址不会被公开。