android viewgrop(实现了事件监听/手动滑动)
package com.example.myviewgroup; import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup; public class MyViewgroup extends ViewGroup {
private int itemWidth;
private int itemHeight;
private int groupWidth;
private int childcount;
private float downpos;
private int startx;
private boolean isclick = false;
private boolean autoplayflag=true;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
autoplay(); handler.sendEmptyMessageDelayed(0, 2000);
}
}; /**
* 自动播放
*/
private void autoplay() {
if(!autoplayflag)return;
int index = getScrollX() / itemWidth;
if (index == 1) {//轮播图前后有重复的条目
scrollTo(groupWidth - itemWidth * 2, 0);
} else
scrollTo(startx - itemWidth, 0);
if (index == childcount - 2) {
scrollTo(itemWidth, 0);
} else {
scrollTo((index + 1) * itemWidth, 0);
}
} public MyViewgroup(Context context) {
super(context);
} public MyViewgroup(Context context, AttributeSet attrs) {
super(context, attrs);
} public MyViewgroup(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
} @Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
if (changed) {
for (int i = 0; i < childcount; i++) {
View view = getChildAt(i);
view.layout(itemWidth * i, 0, itemWidth * (i + 1), itemHeight);
} }
scrollTo(itemWidth, 0);//因为轮播图前后各有一个重复的条目,所以要设置显示第二个。
handler.sendEmptyMessageDelayed(0, 2000);//
} /**
* 接口回调处理响应点击事件
*/ private ClickListener clickListener; public void setonclickistener(ClickListener clickListener) {
this.clickListener = clickListener;
} public interface ClickListener {
public void onclik(View view);
} @Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
int action = event.getAction();
float move = 0;
switch (action) {
case MotionEvent.ACTION_DOWN:
autoplayflag=false;//当点击轮播图停止自动播放
isclick = true;//点击事件标记,true 为点击 false 为滑动事件
startx = 0;
downpos = 0f;
downpos = event.getX();
startx = getScrollX();
break;
case MotionEvent.ACTION_MOVE:
isclick = false;
move = event.getX();
int distance = (int) (move - downpos);
scrollBy(-distance, 0);
downpos = move;
break;
case MotionEvent.ACTION_UP:
int index = startx / itemWidth;//视图索引从0开始
if (isclick) {
isclick = true;
processOnclick(getChildAt(index));
return true;
}
int endx = getScrollX();
int res = endx - startx; //负数为向右滑动,正数为向左滑动
if (Math.abs(res) > itemWidth / 6) {//滑动到视图超过六分之一时再切换
if (res < 0) {
if (index == 1) {//轮播图前后有重复的条目
scrollTo(groupWidth - itemWidth * 2, 0);
} else
scrollTo(startx - itemWidth, 0);
} else {
if (index == childcount - 2) {
scrollTo(itemWidth, 0);
} else {
scrollTo((index + 1) * itemWidth, 0);
}
}
} else {
scrollTo(index * itemWidth, 0);
}
autoplayflag=true;
break;
}
return true;
} private void processOnclick(View child) {
clickListener.onclik(child);
} @Override
public boolean onInterceptTouchEvent(MotionEvent ev) { return true;
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
childcount = getChildCount();
if (childcount > 0) {
measureChildren(widthMeasureSpec, heightMeasureSpec);
View child = getChildAt(0); itemWidth = child.getMeasuredWidth(); itemHeight = child.getMeasuredHeight(); groupWidth = itemWidth * childcount;
setMeasuredDimension(groupWidth, itemHeight);
} else if (childcount == 0) {
setMeasuredDimension(0, 0);
}
}
}
android viewgrop(实现了事件监听/手动滑动)的更多相关文章
- Android监听ScrollView滑动到顶端和底部
Android监听ScrollView滑动到顶端和底部 package cn.testscrollview; import android.os.Bundle; import android. ...
- Android软键盘的隐藏显示、事件监听的代码
把开发过程中重要的一些内容片段做个珍藏,如下资料是关于Android软键盘的隐藏显示.事件监听的内容,应该是对小伙伴们有所用途. public class ResizeLayout extends L ...
- android开发事件监听
第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适, ...
- 关于android软键盘enter键的替换与事件监听
android软键盘事件监听enter键 软件盘的界面替换只有一个属性android:imeOptions,这个属性的可以取的值有 normal,actionUnspecified,actionNo ...
- Android 事件监听处理
事件监听的处理模型包括三个成员:事件源.事件以及事件监听器. 基于监听的事件处理模型一般包括几个步骤: 1.获取普通界面组件: 2.实现事件监听器类 3.将监听器对象注冊给普通组件 当事件源上发生指定 ...
- Android——按钮的事件监听
关于Button按钮的四种事件监听方法总结 首先我们在activity_main.xml里面先定义一个Button空间 <RelativeLayout xmlns:android="h ...
- 事件监听:诀别Android繁琐的事件注册机制——view.setOnXXXXListener
本版本为1.0,支持较少,使用不够方便.相关封装逻辑结构已升级至2.0,详情可参见:更完善的安卓事件监听实现 先简单扯两句这几天学习下来对java事件监听机制的一点感触.客观地讲,java的事件监听机 ...
- android CheckBox控件的定义及事件监听
http://www.beijibear.com/index.php?aid=336 android CheckBox控件的定义及事件监听,本例实现CheckBox控件的定义及点击事件的监听并显示结果 ...
- Android事件监听(二)——点击鼠标事件
Button.ImageButton事件监听(setOnClickListener) 方法一:通过匿名内部类实现 代码如下: package com.note.demo2; import androi ...
随机推荐
- BZOJ:2242: [SDOI2011]计算器
题解:BSGS 问题:map空间 BSGS判无解 a%p!=0 0与最小非负整数 有区别 函数传参类型转换int->long long long long ->int; 费马小定理充分必要 ...
- java课程之团队开发冲刺阶段2.2
一.总结昨天进度 1.单独实现静音功能,还没有进行整体整合 二.遇到的问题 1.一开始设计静音的思路有问题,所以在实现上有些许麻烦,一开始的想法是将这些音量直接设置为0就可以实现静音,但是在恢复响铃模 ...
- SpringBoot 系列教程之事务不生效的几种 case
SpringBoot 系列教程之事务不生效的几种 case 前面几篇博文介绍了声明式事务@Transactional的使用姿势,只知道正确的使用姿势可能还不够,还得知道什么场景下不生效,避免采坑.本文 ...
- Swift 3必看:从使用场景了解GCD新API
https://www.jianshu.com/p/fc78dab5736f 2016.10.06 21:59* 在学习Swift 3的过程中整理了一些笔记,如果想看其他相关文章可前往<Swif ...
- 吴裕雄--天生自然 JAVASCRIPT开发学习:事件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- SASS - @extend(继承)指令
SASS – 简介 SASS – 环境搭建 SASS – 使用Sass程序 SASS – 语法 SASS – 变量 SASS- 局部文件(Partial) SASS – 混合(Mixin) SASS ...
- Flink并行度
并行执行 本节介绍如何在Flink中配置程序的并行执行.FLink程序由多个任务(转换/操作符.数据源和sinks)组成.任务被分成多个并行实例来执行,每个并行实例处理任务的输入数据的子集.任务的并行 ...
- jQuery.ajax提交JSON数据
$.ajax({ type: 'POST', url: "URL", contentType:'application/json', //需要加contentType crossD ...
- 基本pipline用法
#!groovynode { stage('代码获取') { checkout([$class: 'SubversionSCM', additionalCredentials: [], exclude ...
- json,pickle,shelve序列化
import json a = [{"a":"b"}] jd = json.dumps(a) #序列化,就是对象通过内存能够存储和传输的过程 with open ...