其实,在android中画廊视图Gallery和ImageSwitcher组件的使用一文中就介绍过ImageSwitcher的使用,今天这里封装一个自定义的ImageSwitcher,它带有使用手势滑动效果和动画效果,和提供自动切换的接口,以后有这样的需求可以直接拿来用,代码如下:

MyImageSwitcher:

package com.home.testimageswitcher;import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.OnGestureListener;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.Toast;public class MyImageSwitcher extends ImageSwitcher {private Thread t;// 自动切换图片线程private GestureDetector detector;private Context context;private int index;// 图片位置索引private int[] imageIds;public boolean hasStarted = false;// 是否已开启自动切换接口private boolean isSwitching = false;// 是否在自动切换图片public boolean isDown = false;// 是否是按下状态public boolean isFling = false;// 是否正在滑动private int direction = 1;// 方向:1为向左滑动;-1为向右滑动public Handler handler = new Handler() {public void handleMessage(Message msg) {if (msg.what == 1) {setImage(direction);}}};public MyImageSwitcher(Context context, int[] imageIds) {super(context);init(context, imageIds);}class MyOnGestureListener implements OnGestureListener {@Overridepublic boolean onDown(MotionEvent e) {isDown = true;return false;}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {isFling = true;isSwitching = false;// 滑动过程停止切换float instance = e1.getX() - e2.getX();if (instance > 10) {direction = 1;index++;if (index > imageIds.length - 1) {index = 0;}setImage(direction);} else if (instance < -10) {direction = -1;index--;if (index < 0) {index = imageIds.length - 1;}setImage(direction);}if (hasStarted) {startSwitching();}return false;}@Overridepublic void onLongPress(MotionEvent e) {}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {return false;}@Overridepublic void onShowPress(MotionEvent e) {}@Overridepublic boolean onSingleTapUp(MotionEvent e) {return false;}}@Overridepublic boolean onTouchEvent(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_UP) {if (isDown && !isFling) {Toast.makeText(context, "点击了图片", Toast.LENGTH_SHORT).show();}isDown = false;isFling = false;}return super.onTouchEvent(event);}/*** 初始化* * @param context*/private void init(Context context, int[] imageIds) {if (imageIds == null || imageIds.length <= 0) {return;}this.context = context;this.imageIds = imageIds;if (imageIds.length > 1) {this.detector = new GestureDetector(context,new MyOnGestureListener());this.setOnTouchListener(new MyOnTouchListener());this.setLongClickable(true);}this.setFactory(new MyFactory());this.setImageResource(imageIds[index]);}class MyOnTouchListener implements OnTouchListener {@Overridepublic boolean onTouch(View v, MotionEvent event) {return detector.onTouchEvent(event);}}class MyFactory implements ViewFactory {@Overridepublic View makeView() {ImageView imageView = new ImageView(context);imageView.setBackgroundColor(0xFF000000);imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);imageView.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));return imageView;}}/*** 启动线程切换图片*/public void startSwitching() {if (imageIds == null || imageIds.length <= 1) {return;}isSwitching = true;if (t == null || !t.isAlive()) {t = new Thread() {public void run() {while (isSwitching) {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}hasStarted = true;if (direction == 1) {index++;} else {index--;}if (index > imageIds.length - 1) {index = 0;}if (index < 0) {index = imageIds.length - 1;}Message msg = new Message();msg.what = 1;handler.sendMessage(msg);}};};t.start();}}/*** 根据方向设置图片和动画效果* * @param direction*/private void setImage(int direction) {if (direction == 1) {setInAnimation(context, R.anim.push_left_in);setOutAnimation(context, R.anim.push_left_out);setImageResource(imageIds[index]);} else {setInAnimation(context, R.anim.push_right_in);setOutAnimation(context, R.anim.push_right_out);setImageResource(imageIds[index]);}}
}

调用Activity:

package com.home.testimageswitcher;import android.app.Activity;
import android.os.Bundle;public class MainActivity extends Activity {private int[] imageIds = { R.drawable.test1, R.drawable.test2,R.drawable.test3, R.drawable.test4, R.drawable.test5 };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);MyImageSwitcher switcher = new MyImageSwitcher(this, imageIds);setContentView(switcher);switcher.startSwitching();// 开启自动切换}
}

动画系列:

push_left_in.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" ><translateandroid:duration="500"android:fromXDelta="100%p"android:toXDelta="0" /><alphaandroid:duration="500"android:fromAlpha="0.1"android:toAlpha="1.0" /></set>

push_left_out.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" ><translateandroid:duration="500"android:fromXDelta="0"android:toXDelta="-100%p" /><alphaandroid:duration="500"android:fromAlpha="1.0"android:toAlpha="0.1" /></set>

push_right_in.xml:

<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" ><translateandroid:duration="500"android:fromXDelta="-100%p"android:toXDelta="0" /><alphaandroid:duration="500"android:fromAlpha="0.1"android:toAlpha="1.0" /></set>

push_right_out.xml:

<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" ><translateandroid:duration="500"android:fromXDelta="0"android:toXDelta="100%p" /><alphaandroid:duration="500"android:fromAlpha="1.0"android:toAlpha="0.1" /></set>

自定义一个ImageSwitcher相关推荐

  1. python 多线程 类_Python中如何自定义一个多线程类呢?

    摘要: 下文讲述Python中自定义一个多线程类的方法分享,如下所示: 实现思路: 1.定义一个类继承threading.Thread 2.在自定义类中构造函数重写run方法 例: Python3中自 ...

  2. android sqlite自定义函数,Android中自定义一个View的方法详解

    本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...

  3. CodeBlocks: 生成的exe文件自定义一个图标

    CodeBlocks生成的exe文件的图标默认是系统图标,如何自定义一个漂亮的小图标呢? 我是C菜鸟,平时只用CodeBlocks练习c,也不开发什么软件,这个问题就难倒我了. 到网上搜索了一下,发现 ...

  4. opencv2中访问像素的简单方法-自定义一个宏CV_MAT_ELEM2

    利用Mat的step[0],step[1]访问像素的行列,自定义一个宏CV_MAT_ELEM2(src,dtype,y,x),src是待访问的Mat,dtype是src的数据类型(int,float, ...

  5. TF之LiR:利用TF自定义一个线性分类器LiR对乳腺癌肿瘤数据集进行二分类预测(良/恶性)

    TF之LiR:利用TF自定义一个线性分类器LiR对乳腺癌肿瘤数据集进行二分类预测(良/恶性) 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 X_train = np.float32 ...

  6. Android中用图片自定义一个进度条(实现蒙板效果)

    问题概述 对于进度条我相信大家不陌生,这里我就不再多说什么了.因为这个不是重点.我们要说的是如何去自定义一个不一样的进度条.这里用到两张图片(背景和前景),其实是三张(背景.前景和蒙图).当我们的蒙图 ...

  7. 面试干货 | Java 能否自定义一个类叫 java.lang.System?

    本文由读者 apdoer 投稿,apdoer 是一个极具钻研精神的 Java 猿,技术牛X头发茂盛! 博客地址:https://blog.csdn.net/m0_43452671 缘起:一个面试题 最 ...

  8. java自定义一个方法,用于返回两个整数的和

    java自定义一个方法,用于返回两个整数的和 /*** 自定义一个方法* 用于返回两个整数的和*/ public class Test17 {public static int getSum(int ...

  9. python中exception类的_Python自定义一个异常类的方法

    如何实现自定义一个异常 python内置了许多异常类,为编写代码划定红线,才使调试代码时能及时发现错误.那么我们编写一个模块也可以为使用此模块者划定红线,来约束使用者可用哪些数据,这就需要自定义异常类 ...

最新文章

  1. windows远程桌面如果超出最大连接数, 使用命令行mstsc /console登录即可
  2. Angular 7 版本
  3. 图形处理相关资源(面部识别、姿态估计、变形、、、)
  4. Stanford UFLDL教程 反向传播算法(BP算法)
  5. SQL Server2008存储结构之聚集索引
  6. boot整合redis
  7. jQuery 教程01——jQuery安装
  8. 游戏开发之--开源软件1--cocos2d-x(c++)|openbor
  9. 简单博弈论总结加例题解析
  10. python memory-management
  11. bigdecimal java 最大值_Java中的数学运算BigDecimal
  12. 六自由度机器人设计过程-范例
  13. c语言银行卡管理系统的意义,使用会员管理系统的意义
  14. 关于机器人方面的sci论文_科学网-2014年SCI收录机器人期刊22种目录-万跃华的博文...
  15. 计算机桌面显示图标字体怎么变大,电脑桌面字体图标变大了怎么办
  16. 阿里OSS图片持久化,裁切,缩放,格式转换等
  17. 【心理咨询师考试笔记】操作技能(二)——心理评估
  18. uniapp项目H5端横屏问题-样式错乱+字体大小+video
  19. 简单的猜数字游戏--入门
  20. js根据日期计算星期几

热门文章

  1. 从原理到应用,一文带你了解小程序插件能力
  2. 【云周刊】第173期:直击数博|阿里胡晓明:用100亿的投入撬动1000亿的脱贫效应...
  3. 摆花(2012Noip普及组第3题)
  4. mysql 服务意外停止1067错误解决办法小结
  5. 电脑也能管理服务器安全 安全狗服云PC端V2.3发布
  6. js实现treeview 级联修改状态
  7. 我是主考官:给一位应届毕业生的回信
  8. 2.3.14 Python 函数进阶-生成器
  9. 吴颖二:12.27 什么是现货,如何操作才能盈利
  10. mac 使用 pf 做端口转发