Android通過(guò)手勢(shì)實(shí)現(xiàn)答題器翻頁(yè)效果
本文實(shí)例為大家分享了Android答題器翻頁(yè)功能,主要使用ViewFilpper和GestureDetector來(lái)實(shí)現(xiàn),供大家參考,具體內(nèi)容如下
1.效果圖
2.實(shí)現(xiàn)思路
把Activity的TouchEvent事件交個(gè)GestureDetector來(lái)處理,然后使用ViewFilpper使用動(dòng)畫控制多個(gè)組件的之間的切換效果。手勢(shì)的一個(gè)Api就不詳細(xì)說(shuō)了,大家如果不了解可以查一下。
3.實(shí)現(xiàn)的步驟
1)、構(gòu)建手勢(shì)檢測(cè)器
2)、準(zhǔn)備數(shù)據(jù)
3)、為ViewFilpper添加子控件。
4)、初始化Animation數(shù)組
5)、把Activity的TouchEvent事件交個(gè)GestureDetector來(lái)處理
6)、實(shí)現(xiàn) onFling方法
4.代碼實(shí)現(xiàn)
4.1布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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:orientation="vertical" tools:context="com.lidong.demo.view.GestureFilpActivity"> <ViewFlipper android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/viewFlipper"/> </LinearLayout>
4.2 動(dòng)畫文件
left_in.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="500" /> </set>
left_out.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0" android:toXDelta="-100%p" android:duration="500" /> </set>
right_in.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="-100%p" android:toXDelta="0" android:duration="500" /> </set>
right_out.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0" android:toXDelta="100%p" android:duration="500" /> </set>
4.3GestureFilpActivity的實(shí)現(xiàn)
package com.lidong.demo.view; import android.os.Bundle; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import android.widget.ViewFlipper; import com.lidong.demo.AppComponent; import com.lidong.demo.BaseActivity; import com.lidong.demo.R; import com.lidong.demo.view.adapter.ChineseMedicineReportAdapter; import com.lidong.demo.view.model.Question; import java.util.ArrayList; import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; /** *@類名 : GestureFilpActivity *@描述 : *@時(shí)間 : 2016/5/3 16:11 *@作者: 李東 *@郵箱 : lidong@chni.com.cn *@company: chni */ public class GestureFilpActivity extends BaseActivity implements GestureDetector.OnGestureListener{ @Bind(R.id.viewFlipper) ViewFlipper mViewFlipper; //1.定義手勢(shì)檢測(cè)器對(duì)象 GestureDetector mGestureDetector; //2.定義一個(gè)動(dòng)畫數(shù)組,用于為ViewFilpper指定切換動(dòng)畫效果。 Animation[] animations = new Animation[4]; //3.定義手勢(shì)兩點(diǎn)之間的最小距離 final int FLIP_DISTANCE = 50 ; List<Question> mQuestion = new ArrayList<>(); ChineseMedicineReportAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_gesture_filp); ButterKnife.bind(this); setActivityTitle("答題器的實(shí)現(xiàn)"); //1.構(gòu)建手勢(shì)檢測(cè)器 mGestureDetector = new GestureDetector(this,this); //2準(zhǔn)備數(shù)據(jù) List<Question> questions = initData(); mQuestion.addAll(questions); //3.為ViewFilpper添加子控件。 for (int i = 0;i<mQuestion.size();i++){ Question question = mQuestion.get(i); mViewFlipper.addView(addQuestionView(question)); } //4.初始化Animation數(shù)組 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); } @Override protected void setupActivityComponent(AppComponent appComponent) { } private View addQuestionView(Question question){ View view = View.inflate(this, R.layout.activity_chnihealthreport, null); TextView tes = (TextView) view.findViewById(R.id.tv_question); ListView listview = (ListView) view.findViewById(R.id.lv_question_answer); adapter = new ChineseMedicineReportAdapter(this,question); listview.setAdapter(adapter); tes.setText(question.getQuestion()); listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(GestureFilpActivity.this,position+"",Toast.LENGTH_SHORT).show(); Toast.makeText(GestureFilpActivity.this,position+"",Toast.LENGTH_SHORT).show(); if (mViewFlipper.getDisplayedChild() == mQuestion.size() - 1) { Toast.makeText(GestureFilpActivity.this,"最后一個(gè)題",Toast.LENGTH_SHORT).show(); mViewFlipper.stopFlipping(); return; }else { mViewFlipper.setInAnimation(animations[0]); mViewFlipper.setOutAnimation(animations[1]); mViewFlipper.showNext(); } } }); return view; } @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) { } //重點(diǎn)實(shí)現(xiàn)在這里切換 @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (e2.getX() - e1.getX()>FLIP_DISTANCE){ if (mViewFlipper.getDisplayedChild() == 0) { mViewFlipper.stopFlipping(); Toast.makeText(GestureFilpActivity.this,"第一個(gè)題",Toast.LENGTH_SHORT).show(); return false; } else { mViewFlipper.setInAnimation(animations[2]); mViewFlipper.setOutAnimation(animations[3]); mViewFlipper.showPrevious(); return true; } }else if (e1.getX() - e2.getX()>FLIP_DISTANCE){ if (mViewFlipper.getDisplayedChild() == mQuestion.size() - 1) { Toast.makeText(GestureFilpActivity.this,"最后一個(gè)題",Toast.LENGTH_SHORT).show(); mViewFlipper.stopFlipping(); return false; }else { mViewFlipper.setInAnimation(animations[0]); mViewFlipper.setOutAnimation(animations[1]); mViewFlipper.showNext(); return true; } } return false; } @Override public boolean onTouchEvent(MotionEvent event) { //將Activity上的觸發(fā)的事件交個(gè)GestureDetector處理 return this.mGestureDetector.onTouchEvent(event); } private List<Question> initData(){ List<Question> questions = new ArrayList<>(); Question q1 = new Question(); q1.setQuestion("1、\"紅娘\"由來(lái)是出自下列哪部古典名劇:"); List<Question.Answer> mA = new ArrayList<>(); Question.Answer a1 = new Question.Answer(); a1.setAnswerMessage("A《琵琶記》"); Question.Answer a2 = new Question.Answer(); a2.setAnswerMessage("B《西廂記》"); Question.Answer a3 = new Question.Answer(); a3.setAnswerMessage("C《長(zhǎng)生殿》"); Question.Answer a4 = new Question.Answer(); a4.setAnswerMessage("D《桃花扇》"); mA.add(a1); mA.add(a2); mA.add(a3); mA.add(a4); q1.setAnswer(mA); questions.add(q1); Question q2 = new Question(); q2.setQuestion("2.我國(guó)第一部有聲影片是:"); List<Question.Answer> mB = new ArrayList<>(); Question.Answer b1 = new Question.Answer(); b1.setAnswerMessage("A《歌女紅牡丹》"); Question.Answer b2 = new Question.Answer(); b2.setAnswerMessage("B《定軍山》"); Question.Answer b3 = new Question.Answer(); b3.setAnswerMessage("C《林則徐》"); Question.Answer b4 = new Question.Answer(); b4.setAnswerMessage("D《玉人何處》"); mB.add(b1); mB.add(b2); mB.add(b3); mB.add(b4); q2.setAnswer(mB); questions.add(q2); Question q3= new Question(); q3.setQuestion("3.下列哪座山不屬于我國(guó)四大佛山之一:( A)"); List<Question.Answer> mC = new ArrayList<>(); Question.Answer c1 = new Question.Answer(); c1.setAnswerMessage("A《歌女紅牡丹》"); Question.Answer c2 = new Question.Answer(); c2.setAnswerMessage("B《定軍山》"); Question.Answer c3 = new Question.Answer(); c3.setAnswerMessage("C《林則徐》"); Question.Answer c4 = new Question.Answer(); c4.setAnswerMessage("D《玉人何處》"); mC.add(c1); mC.add(c2); mC.add(c3); mC.add(c4); q3.setAnswer(mC); questions.add(q3); Question q4 = new Question(); q4.setQuestion("4.下面哪個(gè)是對(duì)“驚蟄”這個(gè)節(jié)氣的正確描述?"); List<Question.Answer> mD = new ArrayList<>(); Question.Answer d1 = new Question.Answer(); d1.setAnswerMessage("A《歌女紅牡丹》"); Question.Answer d2 = new Question.Answer(); d2.setAnswerMessage("B《定軍山》"); Question.Answer d3 = new Question.Answer(); d3.setAnswerMessage("C《林則徐》"); Question.Answer d4 = new Question.Answer(); d4.setAnswerMessage("D《玉人何處》"); mD.add(d1); mD.add(d2); mD.add(d3); mD.add(d4); q4.setAnswer(mD); questions.add(q4); return questions; } }
5.總結(jié)
1.構(gòu)建手勢(shì)檢測(cè)器,2準(zhǔn)備數(shù)據(jù),3為ViewFilpper添加子控件。4.初始化Animation數(shù)組。5.把Activity的TouchEvent事件交個(gè)GestureDetector來(lái)處理,6.實(shí)現(xiàn)onFling方法。
代碼下載:Android實(shí)現(xiàn)答題器翻頁(yè)效果
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)Android軟件編程有所幫助。
- Android 中使用RecyclerView實(shí)現(xiàn)底部翻頁(yè)
- android中圖片翻頁(yè)效果簡(jiǎn)單的實(shí)現(xiàn)方法
- 解析Android中實(shí)現(xiàn)滑動(dòng)翻頁(yè)之ViewFlipper的使用詳解
- Android實(shí)現(xiàn)閱讀APP平移翻頁(yè)效果
- android ViewPager實(shí)現(xiàn)滑動(dòng)翻頁(yè)效果實(shí)例代碼
- Android自定義左右或上下滑動(dòng)翻頁(yè)效果
- 基于Android實(shí)現(xiàn)3D翻頁(yè)效果
- Android?ViewPager實(shí)現(xiàn)左右滑動(dòng)翻頁(yè)效果
- Android利用懸浮按鈕實(shí)現(xiàn)翻頁(yè)效果
- Android 仿日歷翻頁(yè)、仿htc時(shí)鐘翻頁(yè)、數(shù)字翻頁(yè)切換效果
- RecyclerView+PagerSnapHelper實(shí)現(xiàn)抖音首頁(yè)翻頁(yè)的Viewpager效果
相關(guān)文章
Android酷炫動(dòng)畫效果之3D星體旋轉(zhuǎn)效果
本文要實(shí)現(xiàn)的3D星體旋轉(zhuǎn)效果是從CoverFlow演繹而來(lái),不過(guò)CoverFlow只是對(duì)圖像進(jìn)行轉(zhuǎn)動(dòng),我這里要實(shí)現(xiàn)的效果是要對(duì)所有的View進(jìn)行類似旋轉(zhuǎn)木馬的轉(zhuǎn)動(dòng)2018-05-05Android 中SQLite技術(shù)實(shí)例詳解
這篇文章主要介紹了Android 中SQLite技術(shù)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06RecyclerView設(shè)置間距和添加分割線的方法
在使用RecyclerView布局,經(jīng)常需要調(diào)整間距和添加分割線以達(dá)到更美觀效果,這篇文章主要介紹了RecyclerView設(shè)置間距和添加分割線的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09Android實(shí)現(xiàn)計(jì)算器(計(jì)算表達(dá)式/計(jì)算小數(shù)點(diǎn)以及括號(hào))
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)計(jì)算器功能,計(jì)算表達(dá)式,能計(jì)算小數(shù)點(diǎn)以及括號(hào),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09基于移動(dòng)端真機(jī)調(diào)試的圖文教程(分享)
下面小編就為大家分享一篇基于移動(dòng)端真機(jī)調(diào)試的圖文教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12Android持久化技術(shù)之SharedPreferences存儲(chǔ)實(shí)例詳解
這篇文章主要介紹了Android持久化技術(shù)之SharedPreferences存儲(chǔ),結(jié)合實(shí)例形式較為詳細(xì)的分析了SharedPreferences存儲(chǔ)的原理、應(yīng)用及具體實(shí)現(xiàn)方法,需要的朋友可以參考下2016-01-01Android實(shí)現(xiàn)網(wǎng)絡(luò)加載時(shí)的對(duì)話框功能
這篇文章主要介紹了Android實(shí)現(xiàn)網(wǎng)絡(luò)加載時(shí)的對(duì)話框功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02Android onClick方法與setOnClickListener方法對(duì)比
這篇文章主要介紹了Android onClick方法與setOnClickListener方法對(duì)比的相關(guān)資料,這兩個(gè)方法都是點(diǎn)擊事件處理函數(shù)的方法,它們之間到底有什么區(qū)別呢,下面就給大家說(shuō)下,需要的朋友可以參考下2016-12-12