欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-03-02 13:18:10
本文实例为大家分享了android答题器翻页功能,主要使用viewfilpper和gesturedetector来实现,供大家参考,具体内容如下 1.效果图 2.实...

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

1.效果图

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

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