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

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/51305933 Android 实现答题器功能(通过手势实现翻页效果)1.问题描述Android答题器的实现主要使用了ViewFilpper和GestureDetector来实现。
版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
    @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方法

代码下载
效果图:
这里写图片描述这里写图片描述

相关文章
|
7月前
|
NoSQL 应用服务中间件 PHP
布谷一对一直播源码android版环境配置流程及功能明细
部署需基于 CentOS 7.9 系统,硬盘不低于 40G,使用宝塔面板安装环境,包括 PHP 7.3(含 Redis、Fileinfo 扩展)、Nginx、MySQL 5.6、Redis 和最新 Composer。Swoole 扩展需按步骤配置。2021.08.05 后部署需将站点目录设为 public 并用 ThinkPHP 伪静态。开发环境建议 Windows 操作系统与最新 Android Studio,基础配置涉及 APP 名称修改、接口域名更换、包名调整及第三方登录分享(如 QQ、微信)的配置,同时需完成阿里云与腾讯云相关设置。
|
Android开发
Android开发表情emoji功能开发
本文介绍了一种在Android应用中实现emoji表情功能的方法,通过将图片与表情字符对应,实现在`TextView`中的正常显示。示例代码展示了如何使用自定义适配器加载emoji表情,并在编辑框中输入或删除表情。项目包含完整的源码结构,可作为开发参考。视频演示和源码详情见文章内链接。
305 4
Android开发表情emoji功能开发
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
488 3
|
编解码 测试技术 Android开发
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
本文详细介绍了如何利用CameraX库实现高质量的照片及视频拍摄功能,包括添加依赖、初始化、权限请求、配置预览与捕获等关键步骤。此外,还特别针对不同分辨率和帧率的视频拍摄提供了性能优化策略,确保应用既高效又稳定。
1506 1
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
|
图形学 Android开发
小功能⭐️Unity调用Android常用事件
小功能⭐️Unity调用Android常用事件
|
Android开发 开发者
Android平台无纸化同屏如何实现实时录像功能
Android平台无纸化同屏,如果需要本地录像的话,实现难度不大,只要复用之前开发的录像模块的就可以,对我们来说,同屏采集这块,只是数据源不同而已,如果是自采集的其他数据,我们一样可以编码录像。
147 0
|
Android开发
Android中如何快速的实现RecycleView的拖动重排序功能
使用`ItemTouchHelper`和自定义`Callback`,在`RecyclerView`中实现拖动排序功能。定义`ItemTouchHelperAdapter`接口,`Adapter`实现它以处理`onItemMove`方法。`SimpleItemTouchHelperCallback`设置拖动标志,如`LEFT`或`RIGHT`(水平拖动),并绑定到`RecyclerView`以启用拖动。完成这些步骤后,即可实现拖放排序。关注公众号“AntDream”获取更多内容。
350 3
|
数据库 Android开发 数据安全/隐私保护
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
467 2
|
移动开发 监控 Android开发
构建高效Android应用:从内存优化到电池寿命代码之美:从功能实现到艺术创作
【5月更文挑战第28天】 在移动开发领域,特别是针对Android系统,性能优化始终是关键议题之一。本文深入探讨了如何通过细致的内存管理和电池使用策略,提升Android应用的运行效率和用户体验。文章不仅涵盖了现代Android设备上常见的内存泄漏问题,还提出了有效的解决方案,包括代码级优化和使用工具进行诊断。同时,文中也详细阐述了如何通过减少不必要的后台服务、合理管理设备唤醒锁以及优化网络调用等手段延长应用的电池续航时间。这些方法和技术旨在帮助开发者构建更加健壮、高效的Android应用程序。
|
Android开发 数据安全/隐私保护 iOS开发
ios和安卓测试包发布网站http://fir.im的注册与常用功能
ios和安卓测试包发布网站http://fir.im的注册与常用功能
911 0
ios和安卓测试包发布网站http://fir.im的注册与常用功能
下一篇
oss云网关配置