Android中簡單實現頁面翻轉和自動翻轉的功能

Android中簡單實現頁面翻轉和自動翻轉的功能

1. 效果圖,本功能用了ViewFlipper和GestureDetector (手勢檢測器)兩個關鍵技術點:
在這裏插入圖片描述
2. 先寫好佈局文件,這裏用到了ViewFlipper類,用於切換視圖,畢竟ViewFlipper見得少,先介紹一下。

在xml佈局中的方法介紹:
android:autoStart: 設置自動加載下一個View
android:flipInterval:設置View之間切換的時間間隔
android:inAnimation: 設置切換View的進入動畫
android:outAnimation:設置切換View的退出動畫
當然同樣的在代碼中也可以設置:
isFlipping: 判斷View切換是否正在進行
setFilpInterval:設置View之間切換的時間間隔
startFlipping: 開始View的切換,而且會循環進行
stopFlipping: 停止View的切換
setOutAnimation:設置切換View的退出動畫
setInAnimation: 設置切換View的進入動畫
showNext: 顯示ViewFlipper裏的下一個View
showPrevious: 顯示ViewFlipper裏的上一個View

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".slide.Main2Activity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:onClick="start"
            android:text="開始自動翻頁" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:onClick="stop"
            android:text="停止自動翻頁" />

    </LinearLayout>

    <ViewFlipper
        android:id="@+id/activity_main2_vf"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:flipInterval="1500"></ViewFlipper> //flipInterval 實現自動翻轉時添加,值爲每頁翻轉的時間
</LinearLayout>

3. 接下來是代碼部分,首頁介紹一下GestureDetector :
GestureDetector.OnGestureListener裏包含的事件處理方法如下:
➢boolean onDown(MotionEvent e):當觸碰事件按下時觸發該方法。
➢boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):當用戶手指在觸摸屏_上“拖過”時觸發該方法。其中velocityX、velocityY 代表“拖過”動作在橫向、縱向,上的速度。
➢abstract void onL ongPress(MotionEvente):當用戶手指在屏幕上長按時觸發該方法。
➢boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):當用戶手指在屏幕上“滾動”時觸發該方法。
➢void onShowPress(MotionEvent e):當用戶手指在觸摸屏上按下,而且還未移動和鬆開時觸發該方法。
➢boolean onSingleTapUp(MotionEvent e): 用戶手指在觸摸屏上的輕擊事件將會觸發該方法。

*使用Android的手勢檢測只需兩個步驟。

➊創建一個GestureDetector 對象。創建該對象時必須實現一個GestureDetector.OnGestureListener監聽器實例。

❷爲應用程序的Activity (偶爾也可爲特定組件)的TouchEvent事件綁定監聽器(對應gestureDetector = new GestureDetector(this, this);),在事件處理中指定把Activity (或特定組件),上的TouchEvent事件交給GestureDetector處理。(對應return gestureDetector.onTouchEvent(event);)*

package com.example.mygesture.slide;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.ViewFlipper;

import com.example.mygesture.R;

public class Main2Activity extends AppCompatActivity implements GestureDetector.OnGestureListener {	//實現手勢檢測器接口
    GestureDetector gestureDetector;			//定義手勢檢測器
    ViewFlipper viewFlipper;					
//    Animation[] animations=new Animation[4];  //註釋的部分爲添加動畫效果
    int distance=50;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        init();
    }

    private void init() {
        gestureDetector = new GestureDetector(this, this);//實例化GestureDetector
        viewFlipper=findViewById(R.id.activity_main2_vf);
        viewFlipper.addView(addImageView(R.drawable.q1));//添加圖片
        viewFlipper.addView(addImageView(R.drawable.q2));
        viewFlipper.addView(addImageView(R.drawable.q3));
        viewFlipper.addView(addImageView(R.drawable.q4));
//        animations[0]=AnimationUtils.loadAnimation(this,R.anim.left_in);
//        animations[1]=AnimationUtils.loadAnimation(this,R.anim.left_out);
//        animations[2]=AnimationUtils.loadAnimation(this,R.anim.right_in);
//        animations[3]=AnimationUtils.loadAnimation(this,R.anim.right_out);
    }

    private View addImageView(int resId) {
        ImageView imageView=new ImageView(this);
        imageView.setImageResource(resId);
        imageView.setScaleType(ImageView.ScaleType.CENTER);
        return imageView;
    }
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        viewFlipper.stopFlipping();							//當滑動時停止自動翻轉
        if (e1.getX()-e2.getX()>distance){					//當從右向左滑動時
//            viewFlipper.setInAnimation(animations[0]);   
//            viewFlipper.setOutAnimation(animations[1]);
            viewFlipper.showPrevious();						//返回上一張視圖
            return true;
        }if (e2.getX()-e1.getX()>distance){					//當從左向右滑動時
//            viewFlipper.setInAnimation(animations[2]);
//            viewFlipper.setOutAnimation(animations[3]);
            viewFlipper.showNext();							//切換下一張視圖
            return true;
        }
        return false;
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return gestureDetector.onTouchEvent(event);			//綁定觸摸事件
    }

   public void start(View view) {
        viewFlipper.startFlipping();						//開始自動翻轉,與flipInterval配套使用,缺一不可			
    }

    public void stop(View view) {
        viewFlipper.stopFlipping();							//停止自動翻轉	
    }
    @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) {
    }
}

簡單的翻頁效果已經完成了

Tip: 小白,寫得不好請見諒。若有不對的地方請留言。

關於手勢部分的功能點: Android中實現自定義手勢和識別手勢的功能Android中實現雙指縮放的功能

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章