欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-07 13:43:24
...

1 动画

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

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="1000"
        android:fillAfter="true"
        android:fromXDelta="0"
        android:toXDelta="300" />
</set>

 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);

 

 

 

 

 

 

 

 

相关标签: 自定义控件