Android通过手势实现答题器翻页效果

本文实例为大家分享了Android答题器翻页功能,主要使用ViewFilpper和GestureDetector来实现,供大家参考,具体内容如下

1.效果图

2.实现思路

把Activity的TouchEvent事件交个GestureDetector来处理,然后使用ViewFilpper使用动画控制多个组件的之间的切换效果。手势的一个Api就不详细说了,大家如果不了解可以查一下。

3.实现的步骤

1)、构建手势检测器
2)、准备数据
3)、为ViewFilpper添加子控件。
4)、初始化Animation数组
5)、把Activity的TouchEvent事件交个GestureDetector来处理
6)、实现 onFling方法

4.代码实现

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 动画文件

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的实现

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 *@描述 : *@时间 : 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.定义手势检测器对象 GestureDetector mGestureDetector; //2.定义一个动画数组,用于为ViewFilpper指定切换动画效果。 Animation[] animations = new Animation[4]; //3.定义手势两点之间的最小距离 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("答题器的实现"); //1.构建手势检测器 mGestureDetector = new GestureDetector(this,this); //2准备数据 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数组 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,"最后一个题",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) { } //重点实现在这里切换 @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,"第一个题",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,"最后一个题",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上的触发的事件交个GestureDetector处理 return this.mGestureDetector.onTouchEvent(event); } private List<Question> initData(){ List<Question> questions = new ArrayList<>(); Question q1 = new Question(); q1.setQuestion("1、\"红娘\"由来是出自下列哪部古典名剧:"); 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《长生殿》"); 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.我国第一部有声影片是:"); 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.下列哪座山不属于我国四大佛山之一:( 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.下面哪个是对“惊蛰”这个节气的正确描述?"); 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.总结

1.构建手势检测器,2准备数据,3为ViewFilpper添加子控件。4.初始化Animation数组。5.把Activity的TouchEvent事件交个GestureDetector来处理,6.实现onFling方法。

代码下载:Android实现答题器翻页效果

以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。

时间: 2024-08-22 14:06:16

Android通过手势实现答题器翻页效果的相关文章

jquery+css3问卷答题卡翻页动画效果示例_jquery

CSS3+jQuery制作立体翻页时间展示动画特效.该翻页插件的外观非常华丽喜庆,非常适合产品活动或者育儿网站使用. 这个选项调查的特效以选项卡的形式,每答完一道题目自动切换到下一条,颇具特色.使用jQuery和CSS3,适合HTML5浏览器. 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatib

android ViewPager实现滑动翻页效果实例代码

实现ViewPager的滑动翻页效果可以使用ViewPager的setPageTransformer方法,如下: import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.View; public class ReadViewPager extends ViewPager { public ReadV

android中图片翻页效果简单的实现方法_Android

复制代码 代码如下: public class PageWidget extends View {    private Bitmap foreImage;    private Bitmap bgImage;    private PointF touchPt;    private int screenWidth;    private int screenHeight;    private GradientDrawable shadowDrawableRL;    private Gra

基于Android实现3D翻页效果_Android

最近做了一个简单的3D效果翻页特效,先说说我的思路吧,首先我这个翻页效果并不是两个Activity之间的跳转,而是在同一个activity类切换不同的view而已.我现在的做法是单击一个button然后Gone当前的布局,然后把需要呈现的布局visible,在隐藏当前布局的时候启动动画,然后给动画添加监听,在动画结束时开始另外一个view的入场动画就行了. 下面来看下我的主页面的布局文件: <FrameLayout xmlns:android="http://schemas.android

Android利用悬浮按钮实现翻页效果_Android

今天给大家分享下自己用悬浮按钮点击实现翻页效果的例子. 首先,一个按钮要实现悬浮,就要用到系统顶级窗口相关的WindowManager,WindowManager.LayoutParams.那么在AndroidManifest.xml中添加权限: <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 然后,我们要对WindowManager,WindowManager.Layout

Android利用悬浮按钮实现翻页效果

今天给大家分享下自己用悬浮按钮点击实现翻页效果的例子. 首先,一个按钮要实现悬浮,就要用到系统顶级窗口相关的WindowManager,WindowManager.LayoutParams.那么在AndroidManifest.xml中添加权限: <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 然后,我们要对WindowManager,WindowManager.Layout

android中图片翻页效果简单的实现方法

复制代码 代码如下:public class PageWidget extends View {    private Bitmap foreImage;    private Bitmap bgImage;    private PointF touchPt;    private int screenWidth;    private int screenHeight;    private GradientDrawable shadowDrawableRL;    private Grad

基于Android实现3D翻页效果

最近做了一个简单的3D效果翻页特效,先说说我的思路吧,首先我这个翻页效果并不是两个Activity之间的跳转,而是在同一个activity类切换不同的view而已.我现在的做法是单击一个button然后Gone当前的布局,然后把需要呈现的布局visible,在隐藏当前布局的时候启动动画,然后给动画添加监听,在动画结束时开始另外一个view的入场动画就行了. 下面来看下我的主页面的布局文件: <FrameLayout xmlns:android="http://schemas.android

Android 中使用RecyclerView实现底部翻页

RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好.接下来通过一系列的文章讲解如何使用RecyclerView,彻底抛弃ListView. 最近在做pad端的app,需要一个像网页一样效果,之前使用addView方式,页码少的时候还可以,能实现效果,但是碰到了一个1000多页的界面,就GG了,页码半天显示不出来,于是使用RecyclerView作为容器,主要是看中RecyclerView的复用,不说了,看代