Android技术——视图切换(四)“ViewSwitcher+手势识别”实现视图的滑动切换

Android技术——视图切换(一)~(四)项目的源代码在:https://github.com/YongYuIT/MeiNv_Liulanqi

上文《Android技术——视图切换(三)》实现的图片切换,虽然切换时有动画效果,但是却需要使用按钮才能切换。这个实例中,将尝试用手势识别代替按钮来实现图片切换。

这个实例也是基于前三篇文章里的项目添加而来的。

/MeiNv_Liulanqi/res/layout/activity_view_switcher_huadong.xml文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

<!-- 定义一个ViewSwitcher组件 -->

<ViewSwitcher

android:id="@+id/viewSwitcher"

android:layout_width="fill_parent"

android:layout_height="fill_parent" />

<!-- 定义滚动到上一屏的按钮 -->

</RelativeLayout>

/MeiNv_Liulanqi/src/com/example/meinv_liulanqi/ViewSwitcherHuadongActivity.java文件:

package com.example.meinv_liulanqi;

import android.app.Activity;

import android.os.Bundle;

import android.view.GestureDetector;

import android.view.LayoutInflater;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnTouchListener;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.ViewSwitcher;

import android.widget.ViewSwitcher.ViewFactory;

public class ViewSwitcherHuadongActivity extends Activity

{

private int             screenNo = -1;

private int             screenNum;

public ViewSwitcher     switcher;

public int[]            img_ids;

private GestureDetector myDesDet;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_view_switcher_huadong);

// GestureDetector用于从OnTouchListener的onTouch函数中接收数据由此判别手势,

// 识别出手势后,由OnGestureListener响应。

myOnGestureListener listener = new myOnGestureListener(this);

myDesDet = new GestureDetector(listener);

img_ids = new int[] { R.drawable.linzhiling, R.drawable.liuyan,

R.drawable.yangmi };

screenNum = img_ids.length;

// 为ViewSwitcher提供视图工厂

switcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);

myViewFactory factory = new myViewFactory(this.getLayoutInflater(),

myDesDet);

switcher.setFactory(factory);

// 初始化

getNext(switcher, img_ids);

}

public void getNext(ViewSwitcher _switcher, int[] _img_ids)

{

if (screenNo < screenNum - 1)

{

screenNo++;

// 设置视图切换的动画效果

_switcher.setInAnimation(ViewSwitcherHuadongActivity.this,

R.anim.slide_in_right);

_switcher.setOutAnimation(ViewSwitcherHuadongActivity.this,

R.anim.slide_out_left);

// 获取下一个视图的实例

LinearLayout lil = (LinearLayout) _switcher.getNextView();

ImageView img = (ImageView) lil.findViewById(R.id.img_meinv);

img.setImageResource(_img_ids[screenNo]);

// 切换视图

_switcher.showNext();

}

}

public void getPrev(ViewSwitcher _switcher, int[] _img_ids)

{

if (screenNo > 0)

{

screenNo--;

// 设置视图切换的动画效果

_switcher.setInAnimation(ViewSwitcherHuadongActivity.this,

R.anim.slide_in_lef);

_switcher.setOutAnimation(ViewSwitcherHuadongActivity.this,

R.anim.slide_out_right);

// 获取下一个视图的实例

LinearLayout lil = (LinearLayout) _switcher.getNextView();

ImageView img = (ImageView) lil.findViewById(R.id.img_meinv);

img.setImageResource(_img_ids[screenNo]);

// 切换视图

_switcher.showPrevious();

}

}

class myViewFactory implements ViewFactory

{

private LayoutInflater  inflater;

private GestureDetector desDet;

public myViewFactory(LayoutInflater _inf, GestureDetector _desDet)

{

inflater = _inf;

desDet = _desDet;

}

@Override

public View makeView()

{

// 提供下一个视图的实例

View v = inflater.inflate(R.layout.fragment_layout, null);

ImageView img = (ImageView) v.findViewById(R.id.img_meinv);

// 为图片注册触摸事件监听器

img.setOnTouchListener(new myOnTouchListener(desDet));

return v;

}

}

// 扩展得到自己的触摸事件监听器

class myOnTouchListener implements OnTouchListener

{

private GestureDetector desDet;

public myOnTouchListener(GestureDetector _desDet)

{

desDet = _desDet;

}

@Override

public boolean onTouch(View arg0, MotionEvent arg1)

{

// 将监听数据传到GestureDetector,GestureDetector可以从中判别手势

return desDet.onTouchEvent(arg1);

}

}

}

/MeiNv_Liulanqi/src/com/example/meinv_liulanqi/myOnGestureListener.java文件:

package com.example.meinv_liulanqi;

import java.util.Date;

import android.view.MotionEvent;

import android.view.GestureDetector.OnGestureListener;

public class myOnGestureListener implements OnGestureListener

{

private ViewSwitcherHuadongActivity act;

private static Date                 lastTime = null;

public myOnGestureListener(ViewSwitcherHuadongActivity a)

{

act = a;

}

@Override

// 第三个参数是:滑动手势在水平方向上的位移量

// 第四个参数是:滑动手势在垂直方向上的位移量

public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,

float distanceY)

{

// 获取当前时间

Date curDate = new Date(System.currentTimeMillis());

float shijiancha = 1000;

if (lastTime != null)

{

shijiancha = curDate.getTime() - lastTime.getTime();

}

// 对比两次滑动手势之间的时间间隔。

// 由于对屏幕的一次滑动可能会被GestureDetector识别到好几次手势,所以需要过滤掉时间间隔太短的手势。

if (shijiancha > 500)

{

if (distanceX > 10)

{

act.getNext(act.switcher, act.img_ids);

}

if (distanceX < -10)

{

act.getPrev(act.switcher, act.img_ids);

}

}

lastTime = curDate;

return true;

}

@Override

public boolean onDown(MotionEvent arg0)

{

// TODO Auto-generated method stub

return true;

}

@Override

public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,

float arg3)

{

// TODO Auto-generated method stub

return true;

}

@Override

public void onLongPress(MotionEvent arg0)

{

// TODO Auto-generated method stub

}

@Override

public void onShowPress(MotionEvent arg0)

{

// TODO Auto-generated method stub

}

@Override

public boolean onSingleTapUp(MotionEvent arg0)

{

// TODO Auto-generated method stub

return true;

}

}

实现的效果:

美女滑动中...

时间: 2024-11-05 18:32:04

Android技术——视图切换(四)“ViewSwitcher+手势识别”实现视图的滑动切换的相关文章

Android自定义顶部栏及侧滑菜单和fragment+viewpag滑动切换的实现

嘿嘿嘿,关于android滑动的操作,是不是经常都会用到呢. 我肯定也要学习一下啦. https://blog.csdn.net/u013184970/article/details/82882107 https://blog.csdn.net/qq_35820350/article/details/82460376 在网上学习了一下,这两篇文章写的不错. 来看一下效果 共有4各部分 1.自定义顶部栏 2.侧滑菜单 3.弹出菜单 4.标签滑动切换 进入具体实现环节啦 第一 .自定义顶部栏 1.先

Android随笔--使用ViewPager实现简单地图片的左右滑动切换

Android中图片的左右切换随处可见,今天我也试着查阅资料试着做了一下,挺简单的一个小Demo,却也发现了一些问题,话不多说,上代码~: 使用了3个xml文件作为ViewPager的滑动page,布局都是相同的,如下只展示其中之一: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/

Android典型界面设计——ViewPage+Fragment实现区域顶部tab滑动切换

一.问题描述 本系列将结合案例应用,陆续向大家介绍一些Android典型界面的设计,首先说说tab导航,导航分为一层和两层(底部区块+区域内头部导航),主要实现方案有RadioGroup+ViewPage+Fragment.Viewpager Indicator.ActionBar Tabs.FragmentTabHost+Fragment等,下面我们先采用RadioGroup+ViewPage+Fragment实现区域头部导航. 如图所示: 二.案例主要组件 1.先看一下MainActivit

上下滑动切换页面

http://code4app.com/ios/多方向切换视图/51de7e506803fa916d000001 iOS开发------仿知乎上下滑动切换页面 http://blog.csdn.net/runintolove/article/details/50887197 http://www.docin.com/p-1052279356.html 使用viewpager嵌套实现上下左右滑动切换图片(IOS双向滚动翻页效果相同) 1 关于ViewPager的知识在这就不详细介绍了,有不是很了解

Android零基础入门第54节:视图切换组件ViewSwitcher

前面三期学习了ProgressBar系列组件,那本期开始一起来学习ViewAnimator组件. 一.ViewAnimator组件概述 ViewAnimator是一个基类,它继承了 FrameLayout,因此它表现出FrameLayout的特征,可以将多个View组件叠在一起. ViewAnimator额外增加的功能正如它的名字所暗示的一样,ViewAnimator可以在View切换时表现出动画效果. ViewAnimator及其子类的继承关系图如下图所示. ViewAnimator及其子类也

Android技术——视图切换(二)借助ViewPage实现Tab滑动导航

一.早期android(android.support.v4)提供了一系列支持Fragment滑动切换的类,主要是: 1.ViewPager:它时Fragment容器,可以同时管理多个Fragment,并允许多个Fragment切换时提供动画效果. 2.FragmentPagerAdapter:Adapter类,用于为ViewPager提供多个Fragment.此类通常需要扩展. 3.PagerTitleStrip:与ViewPager结合使用,用于在ViewPager上显示"导航条"

Android学习笔记二十四之ListView列表视图二

Android学习笔记二十四之ListView列表视图二 前面一篇我们介绍了常用的几种适配器的简单实现和ListView的简单使用,这一篇中,我们介绍一下ListView的优化和一些其它的问题. ListView优化方法一 在ListView中,我们最常用的就是自定义Adapter,在我们自定义Adapter中,需要实现两个比较重要的方法getCount()和getView(),前者是负责计算ListView的总Item数,后者是生成Item,有多少个Item就会调用getView()方法多少次

Android项目实战(四):ViewPager切换动画(3.0版本以上有效果)

原文:Android项目实战(四):ViewPager切换动画(3.0版本以上有效果) 学习内容来自“慕课网” 一般APP进去之后都会有几张图片来导航,这里就学习怎么在这张图片切换的时候添加切换动画效果 先看布局文件 activity_main.layout <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.c

Android项目实战(四十四):Zxing二维码切换横屏扫描

原文:Android项目实战(四十四):Zxing二维码切换横屏扫描 Demo链接 默认是竖屏扫描,但是当我们在清单文件中配置横屏显示的时候: <activity android:name=".CaptureActivity" android:screenOrientation="landscape" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" /> 这时候扫描