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 ...
随机推荐
- C# Socket编程入门
一直没有触及到这一块儿,学习下 在看一个小demo https://www.cnblogs.com/yy3b2007com/p/7476458.html
- iOS延迟执行方法
swift 4.0中dispatch_async,dispatch_after的使用 2018年03月28日 16:15:44 xiao_yuly 阅读数:3576 版权声明:本文为博主原创文章,未经 ...
- Linux下MSSQL部署
目前主要使用的red hat系列的linux版本,CentoS 7.X,MSSQL2017 微软官方说明地址:https://docs.microsoft.com/zh-cn/sql/linux/qu ...
- 寒假day24
数据挖掘得继续深入,人物画像需要进行更多层次的分析
- POJ 2362:Square 觉得这才算深度搜索
Square Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 21821 Accepted: 7624 Descripti ...
- 新iPhone的高售价下,苹果供应商们是该笑还是该哭?
自新 iPhone发布之日起,世界就从未停止讨论其售价,越来越多的人开始困惑:新 iPhone毫无创新亮点,有什么底气卖到12799RMB呢?整个地球都在期待苹果推出廉价版 iPhone,望眼欲穿地等 ...
- OSS 图片处理流程
1.步骤一 2.步骤二 3.步骤三 4.步骤四 5.步骤五(步骤4完成会自动添加cname用户解析,不需要自己去加,只需要点击进来看下是否添加成功即可) 通过以上步骤就可以实现了图片服务的配置
- nodejs(13)模块加载机制
模块加载机制 优先从缓存中加载 当一个模块初次被 require 的时候,会执行模块中的代码,当第二次加载相同模块的时候,会优先从缓存中查找,看有没有这样的一个模块! 好处:提高模块的加载速度:不需要 ...
- re模块2
# 元字符+,*遇到?后就会变为贪婪匹配 print(re.findall('abc+?','abcccccc')) #['abc'] print(re.findall('abc*?','abcccc ...
- python numpy和矩阵
2.numpy数据选取 lst=[[1, 2, 3], [4, 5, 6]] np.array(lst)[:-1] Out[32]: array([[1, 2, 3]]) np.array(lst)[ ...