Andorid开发自定义View(二)滑动

1 动画

可以采用View动画来移动,需要在res目录中新建anim文件夹并创建translate.xml文件



    

 fromXDelta 属性为动画起始时 X坐标上的位置  
 toXDelta   属性为动画结束时 X坐标上的位置  
 fromYDelta 属性为动画起始时 Y坐标上的位置  
 toYDelta   属性为动画结束时 Y坐标上的位置

 duration  属性为动画持续时间 (毫秒为单位) 

android:toXDelta="100%",表示自身的100%,也就是从View自己的位置开始。

android:toXDelta="80%p",表示父层View的80%,是以它父层View为参照的。

在java文件中调用

mCustomView = findViewById(R.id.mCustomView);
mCustomView.setAnimation(AnimationUtils.loadAnimation(context, R.anim.translate));

但是当使用动画时 并不会改变View位置参数,也就是说虽然View的位置移动了,但是点击移动后的View并不会触发点击事件,而点击View移动前的位置则会触发点击事件,所以需要使用属性动画来解决

ObjectAnimator.ofFloat(mCustomView, "translationX", 0, 300).setDuration(1000).start();

2 scrollTo和scrollBy

在调用scrollBy的时候

  ((View) getParent()).scrollBy(-offsetX,-offsetY);

 

3 Scroller

Scroller本身不能实现View 的滑动,需要和computeScroll方法配合才能实现弹性滑动的效果。

public CustomView(Context context, @Nullable AttributeSet attrs)
    {
        super(context, attrs);
        scroller = new Scroller(context);
    }

    @Override
    public void computeScroll()
    {
        super.computeScroll();
        if (scroller.computeScrollOffset())
        {
            ((View) getParent()).scrollTo(scroller.getCurrX(), scroller.getCurrY());
            invalidate();
        }
    }
public void smoothScrollTo(int destX, int destY)
    {
        int scroollX = getScrollX();
        int delta = destX -scroollX;
        scroller.startScroll(scroollX,0,delta,0,2000);
        invalidate();//无效

    }

 

之后再java中调用smoothScrollTo方法

mCustomView.smoothScrollTo(-400, 0);

 

 

 

 

 

 

 

 

你可能感兴趣的:(自定义控件,Andorid)