• APP实现相册翻页功能


    简单布局:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:paddingTop="16dp"
        android:paddingBottom="16dp"
        tools:context=".MainActivity">
    
        <ViewFlipper
            android:id="@+id/flipper"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </ViewFlipper>
    
    </RelativeLayout>
    View Code

    实现步骤:

    第一步:让MainActivity实现GestureDetector.OnGestureListener接口,并实现其所有方法
    public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener 
    @Override
        public boolean onDown(MotionEvent e) {
            return false;
        }
    
    @Override
        public void onShowPress(MotionEvent e) {
    
        }
    
    @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return false;
        }
    
    @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            return false;
        }
    
    @Override
        public void onLongPress(MotionEvent e) {
    
        }
    
    @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            return false;
        }
    View Code
    第二步:定义一个全局的手势检测器
    GestureDetector detector;
    在类里面定义全局参数
    Animation[] animation = new Animation[4];
    final int distance = 50; //记录手势动作两点之间的最小距离
    private int[] images = new          
    int[]{R.drawable.img01,R.drawable.img02,R.drawable.img03,R.drawable.img04};
    ViewFlipper flipper;
    第三步:将要显示的图片加载到ViewFlipper中,并初始化动画数组
    flipper = findViewById(R.id.flipper);
    for(int i = 0;i < images.length;i++){
           ImageView imageView = new ImageView(this);
           imageView.setImageResource(images[i]);
           flipper.addView(imageView);
    }
    完整的onCreate()方法为
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //第一个参数:上下文对象;第二个参数:手势监听器对象
            detector = new GestureDetector(MainActivity.this,this);
            //第三步:将要显示的图片加载到ViewFlipper中,并初始化动画数组
            flipper = findViewById(R.id.flipper);
            for(int i = 0;i < images.length;i++){
                ImageView imageView = new ImageView(this);
                imageView.setImageResource(images[i]);
                flipper.addView(imageView);
            }
            animation[0] = AnimationUtils.loadAnimation(this,R.anim.slide_in_left);
            animation[1] = AnimationUtils.loadAnimation(this,R.anim.slide_out_left);
            animation[2] = AnimationUtils.loadAnimation(this,R.anim.slide_in_right);
            animation[3] = AnimationUtils.loadAnimation(this,R.anim.slide_out_right);
        }
    onCreate
    第四步:在onFling()方法中通过触摸事件的X坐标判断是向左滑动还是向右滑动,并且为其设置动画
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            //第四步:在onFling()方法中通过触摸事件的X坐标判断是向左滑动还是向右滑动,并且为其设置动画
            //从右向左滑
            if(e1.getX()-e2.getX()>distance ){
                flipper.setInAnimation(animation[2]);
                flipper.setOutAnimation(animation[1]);
                flipper.showPrevious();
                return true;
            }
            //从左向右滑
            else if(e2.getX()-e1.getX()>distance ){
                flipper.setInAnimation(animation[0]);
                flipper.setOutAnimation(animation[3]);
                flipper.showNext();
                return true;
            }
            return false;
        }
    onFling
    第五步:将Activity上的触摸事件交给GesrureDetector处理
    @Override
        public boolean onTouchEvent(MotionEvent event) {
    
            return detector.onTouchEvent(event);
        }

    注意:需要导入动画文件

    slide_in_left.xml
    <?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="500" android:fromXDelta="-100%p" android:interpolator="@android:anim/accelerate_interpolator" android:toXDelta="0%p" > </translate>
    slide_out_left.xml
    <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:fromXDelta="0%p"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toXDelta="-100%p" >
    </translate>
    slide_in_right.xml
    <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:fromXDelta="100%p"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toXDelta="0%p" >
    </translate>
    slide_out_right.xml
    <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:fromXDelta="0%p"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toXDelta="100%p" >
    </translate>

    至此,一个简单的可以左右翻动的相册就可以展现了

     
     
     


     
     
  • 相关阅读:
    采用闭锁(CountDownLatch)控制线程的先后顺序(一)
    采用java信号量(semaphore)让线程轮流打印
    生产者消费者模式的java实现(实现四)
    生产者消费者模式的java实现(实现三)
    生产者消费者模式的java实现(实现二)
    生产者消费者模式的java实现(实现一)
    求最大子串和 最长子串的java写法
    Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process 异常处理
    定时任务服务器不定时重启原因解析
    centos 6.3 + gerrit-2.8.6 + repo 实践
  • 原文地址:https://www.cnblogs.com/MuZiJin/p/12145029.html
Copyright © 2020-2023  润新知