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(实现了事件监听/手动滑动)的更多相关文章

  1. Android监听ScrollView滑动到顶端和底部

    Android监听ScrollView滑动到顶端和底部     package cn.testscrollview; import android.os.Bundle; import android. ...

  2. Android软键盘的隐藏显示、事件监听的代码

    把开发过程中重要的一些内容片段做个珍藏,如下资料是关于Android软键盘的隐藏显示.事件监听的内容,应该是对小伙伴们有所用途. public class ResizeLayout extends L ...

  3. android开发事件监听

    第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适, ...

  4. 关于android软键盘enter键的替换与事件监听

    android软键盘事件监听enter键  软件盘的界面替换只有一个属性android:imeOptions,这个属性的可以取的值有 normal,actionUnspecified,actionNo ...

  5. Android 事件监听处理

    事件监听的处理模型包括三个成员:事件源.事件以及事件监听器. 基于监听的事件处理模型一般包括几个步骤: 1.获取普通界面组件: 2.实现事件监听器类 3.将监听器对象注冊给普通组件 当事件源上发生指定 ...

  6. Android——按钮的事件监听

    关于Button按钮的四种事件监听方法总结 首先我们在activity_main.xml里面先定义一个Button空间 <RelativeLayout xmlns:android="h ...

  7. 事件监听:诀别Android繁琐的事件注册机制——view.setOnXXXXListener

    本版本为1.0,支持较少,使用不够方便.相关封装逻辑结构已升级至2.0,详情可参见:更完善的安卓事件监听实现 先简单扯两句这几天学习下来对java事件监听机制的一点感触.客观地讲,java的事件监听机 ...

  8. android CheckBox控件的定义及事件监听

    http://www.beijibear.com/index.php?aid=336 android CheckBox控件的定义及事件监听,本例实现CheckBox控件的定义及点击事件的监听并显示结果 ...

  9. Android事件监听(二)——点击鼠标事件

    Button.ImageButton事件监听(setOnClickListener) 方法一:通过匿名内部类实现 代码如下: package com.note.demo2; import androi ...

随机推荐

  1. java课程之团队开发冲刺阶段2.6

    总结昨天进度: 1.总体的思路已经完成,代码也差不多了,只剩下对闹钟activity的设置 遇到的困难: 1.在设置震动的时候,对方法有点不太理解,所以使用的时候产生了错误,没有达到预期的效果 今天的 ...

  2. SFINAE 与 type_traits

    SFINAE 与 type_traits SFINAE 替换失败不是错误 (Substitution Failure Is Not An Error),此特性被用于模板元编程. 在函数模板的重载决议中 ...

  3. 剑指offer_1.24_Day_4

    构建乘积数组 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1] ...

  4. 第二阶段scrum-1

    1.整个团队的任务量: 2.任务看板: 会议照片: 产品状态: 注册登陆界面功能正在实装,消息收发功能正在制作 雷达界面已经完成.

  5. iOS 多线程 GCD part3:API

    https://www.jianshu.com/p/072111f5889d 2017.03.05 22:54* 字数 1667 阅读 88评论 0喜欢 1 0. 预备知识 GCD对时间的描述有些新奇 ...

  6. 汉诺塔(思维、DP思想)

    链接:https://ac.nowcoder.com/acm/contest/3007/C来源:牛客网 题目描述 现在你有 N 块矩形木板,第 i 块木板的尺寸是 Xi*Yi,你想用这些木板来玩汉诺塔 ...

  7. Python 中异常嵌套

    在Python中,异常也可以嵌套,当内层代码出现异常时,指定异常类型与实际类型不符时,则向外传,如果与外面的指定类型符合,则异常被处理,直至最外层,运用默认处理方法进行处理,即停止程序,并抛出异常信息 ...

  8. POJ 3970:Party

    Party Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status ...

  9. unzip 小坑

    unzip test.zip 直接将zip解压到当前目录下,保留test级目录. unzip test.war 直接将.war解压到当前目录,不保留test级目录,所以建议使用 unzip test. ...

  10. BZOJ [Scoi2010]游戏

    题解: 解法一:建立图论模型,发现只要联通块中有环则这个联通块中的值都可以被攻击到 如果是树,则只能攻击size-1个 解法二:二分图匹配,二分答案,看看是否能攻击到mid #include<i ...