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软件编程有所帮助。

(0)

相关推荐

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

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

  • 解析Android中实现滑动翻页之ViewFlipper的使用详解

    1)View切换的控件-ViewFlipper介绍 ViewFilpper类继承于ViewAnimator类.而ViewAnimator类继承于FrameLayout. 查看ViewAnimator类的源码可以看出此类的作用主要是为其中的View切换提供动画效果.该类有如下几个和动画相关的方法. setInAnimation:设置View进入屏幕时候使用的动画.该方法有两个重载方法,即可以直接传入Animation对象,也可以传入定义的Animation文件的resourceID. setOut

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

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

  • 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基于ListView实现类似QQ空间的滚动翻页与滚动加载效果

    本文实例讲述了Android基于ListView实现类似QQ空间的滚动翻页与滚动加载效果.分享给大家供大家参考,具体如下: 1. 滚动加载 listView.setOnScrollListener(new OnScrollListener() { //添加滚动条滚到最底部,加载余下的元素 @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == OnScro

  • Android程序开发ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)

    例子中用于解析Json的Gson请自己Google下载 主Activity: package COM.Example.Main; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import COM.Example.Main.R; import COM.Example.Main.stringG

  • 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实现阅读APP平移翻页效果

    自己做的一个APP需要用到翻页阅读,网上看过立体翻页效果,不过bug太多了还不兼容.看了一下多看阅读翻页是采用平移翻页的,于是就仿写了一个平移翻页的控件.效果如下: 在翻页时页面右边缘绘制了阴影,效果还不错.要实现这种平移翻页控件并不难,只需要定义一个布局管理页面就可以了.具体实现上有以下难点: 1.循环翻页,页面的重复利用. 2.在翻页时过滤掉多点触碰. 3.采用setAdapter的方式设置页面布局和数据. 下面就来一一解决这几个难点.首先看循环翻页问题,怎么样能采用较少的页面实现这种翻页呢

  • android自定义控件创建翻页接口详细代码

    本文分享的这个类的目的是为在看书翻页时,需要进行的动作提供接口,利用android自定义控件创建翻页接口,具体内容如下 BookPage.java package com.horse.util; import java.text.DecimalFormat; import java.util.Vector; import com.horse.bean.Chapter; import android.graphics.Bitmap; import android.graphics.Canvas;

  • Android使用手势实现翻页效果

    本程序的手势检测思路就是把Activity的TouchEvent交给GestureDetector处理,本程序使用了一个ViewFlipper组件,ViewFlipper可使用动画控制多个组件之间的切换效果. 本实例程序通过GestureDetector来检测用户的手势动作,并根据手势动作来控制ViewFlipper包含的View组件的切换,从而实现翻页效果. activity_main.xml布局界面代码: <?xml version="1.0" encoding="

随机推荐