版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/51305933

Android 实现答题器功能(通过手势实现翻页效果)

1.问题描述

Android答题器的实现主要使用了ViewFilpper和GestureDetector来实现。

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;@Overrideprotected 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);}@Overrideprotected 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() {@Overridepublic 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;}@Overridepublic boolean onDown(MotionEvent e) {return false;}@Overridepublic void onShowPress(MotionEvent e) {}@Overridepublic boolean onSingleTapUp(MotionEvent e) {return false;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {return false;}@Overridepublic void onLongPress(MotionEvent e) {}//重点实现在这里切换@Overridepublic 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;}@Overridepublic 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 实现答题器功能(通过手势实现翻页效果)...相关推荐

  1. Android 实现答题器功能(通过手势实现翻页效果)

    Android 实现答题器功能(通过手势实现翻页效果) 1.问题描述 Android答题器的实现主要使用了ViewFilpper和GestureDetector来实现. 2.实现思路 把Activit ...

  2. android控件翻书效果,android ViewPager实现滑动翻页效果实例代码

    实现ViewPager的滑动翻页效果可以使用ViewPager的setPageTransformer方法,如下:import android.content.Context;import androi ...

  3. android 翻书动画效果怎么做,android ViewPager实现滑动翻页效果实例代码

    实现ViewPager的滑动翻页效果可以使用ViewPager的setPageTransformer方法,如下: import android.content.Context; import andr ...

  4. linux+手机+翻页,在Android手机上实现阅读器的翻页效果

    本篇文章来谈谈怎么使用java实现翻页效果,就像电子阅读器那样. 现在先来看看翻页的原理图: 先了解各个字母表示的含义: A-把书页翻起来后看到的背面区域 B-把书页翻起来后看到的下一页的一角 C-当 ...

  5. android 阅读器自动滚动,在Android手机上实现阅读器翻页效果.doc

    在Android手机上实现阅读器翻页效果 先了解各个字母表示的含义:A-把书页翻起来后看到的背面区域B-把书页翻起来后看到的下一页的一角C-当前页的可见部分.a-手指滑动页角到达的位置b-当前页翻起来 ...

  6. Delphi 10.4.2 轻松实现Android/IOS txt小说电子书阅读器应用APP翻页效果

    Delphi 10.4.2是最新版本的跨平台本机应用开发工具,一套代码可编译到五个操作系统上:iOS.Android.Windows.macOS 和 Linux: 本代码仅仅数十行即可轻松实现Andr ...

  7. Android 实现书籍翻页效果----升级篇

    自从之前发布了<Android 实现书籍翻页效果----完结篇 >之后,收到了很多朋友给我留言,前段时间由于事情较多,博客写得太匆忙很多细节地方没有描述清楚.所以不少人对其中的地方有不少不 ...

  8. android 电子书源码,翻页效果

    这两天模仿着做了一个apk电子书的应用,有翻页效果,本来是想学一下自己写的,无奈,最后偷懒使用了别人写的 翻页类 PageWidget.java 下面是工程文件的结构 这个是写的类的包结构,PageV ...

  9. Android viewpager2实现翻页效果

    为什么要实现翻页效果?减少用户的操作 viewpager2是基于recyclerview实现的,自带懒加载功能 viewpager2是对recyclerview的封装 要实现下面这个效果 viewpa ...

最新文章

  1. 汇总|C++系统计时方法以及系统时间戳获取方法
  2. Android开发之浅谈Service的基本概况和常见问题
  3. SAP 电商云 Spartacus UI B2B checkout 点击 Continue 不能跳转到下一页面
  4. struts2 中文件的位置问题
  5. .Net学习笔记----2015-06-30(超市收银系统01-仓库类)
  6. 异常的分类 java 1615309080
  7. 同一个目录下html页面跳转,webpack打包多页应用,如何处理不同html页面(通过a标签)之间的跳转?...
  8. bzoj2661: [BeiJing wc2012]连连看
  9. lnmp部署 -----1
  10. linux7dhcpd服务命令,CentOS7系统架设DHCP服务
  11. apk一键脱壳工具_海量破解、修改、无广告软件一键获取!一个工具就能轻松搞定!...
  12. 一个超厉害的在线画图工具
  13. 国外10个最佳和最流行的酷站推荐网站
  14. Anaconda Prompt 怎么切换工作路径
  15. input反应慢 vue_vue 输入框速度慢的问题
  16. Tomcat NIO、APR 对比
  17. TensorFlow 2.9的零零碎碎(六)-模型训练和评价
  18. 2021年备战面试--算法13
  19. vue2与vue3的区别
  20. 教育青少年计算机等级考试,《新编计算机等级考试培训教程 新一级》青少年素质教育丛书.pdf...

热门文章

  1. 注会之会计 无形资产
  2. MSF编码+VS编译木马免杀
  3. Hi3559AV100/Hi3559CV100 DDR4参数配置说明
  4. oracle获取100条之后的数据,oracle获取前50条数据
  5. 信号与系统复习归纳(十一):Z变换+例题
  6. 火爆全网的老照片修复技术,手把手教你怎么玩儿!
  7. 互联网下半场,具备这个技能的产品经理将越来越值钱!
  8. 生成式AI颠覆了所有人机交互模式,大批产品经理失业
  9. 通俗易懂浅谈一下服务器异地容灾备份
  10. JavaScript 时间与Unix时间戳互相转换,指定时间转换或获取当前时间