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 ...
随机推荐
- Java TCP发送与接收
IP地址?端口号?主机名? 什么是Socket? 什么是UDP? 什么是TCP? UDP和TCP区别? 以上问题请自行百度,有标准解释,此处不再赘述,直接上干货! 实例: 发送端: public cl ...
- 文献阅读报告 - 3DOF Pedestrian Trajectory Prediction
文献 Sun L , Yan Z , Mellado S M , et al. 3DOF Pedestrian Trajectory Prediction Learned from Long-Term ...
- Spring注解@ResponseBody
@Responsebody 将内容或对象作为http响应正文返回,并调用适合HttpMessageConverter的Adapter转换对象,写入输出流. 写在方法上面表示:表示该方法的返回结果直接写 ...
- 在阿里云Centos7.6中部署nginx1.16+uwsgi2.0.18+Django2.0.4
上次在网上找了一个在阿里云Centos7.6中部署nginx1.16+uwsgi2.0.18+Django2.0.4的文档,可能是这个文档不是最新版的,安装的时候遇到了很多问题, 最后跟一个大神要了一 ...
- idea排除要编译的文件
感觉应该有更好的方式.VS中可以右键文件从项目中排除 如果要恢复选中要恢复的文件,点击 +下的-即可
- SAP_ABAP常用事务代码
ST05: 性能跟踪(Performance Trace) SE30/SAT: ABAP对象性能分析 ST12: 单个对象性能分析(Single transaction analysis)
- POJ 3911:Internet Service Providers
Internet Service Providers Time Limit: 2MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I ...
- VEH&VCH
本文99.9%的代码及内容作者:mengwuji 来自:http://www.mengwuji.net/forum.php?mod=viewthread&tid=1371 VEH:向量化异常处 ...
- Python时间问题
获取当前的时间,time只能精确到秒,而datetime可以精确到毫秒,所以使用格式化的时候要注意. nowTime=time.localtime((time.time())) t=time.strf ...
- python基础2--进制、字符编码和文件处理
一.进制 1.二进制 定义 二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一" 转换方式 二进制转换为十进制: 把二进制数按权展开.相加即得十进制数. ...