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);
}
}
}
posted @ 2019-04-10 18:18  ForMeDream  阅读(545)  评论(0编辑  收藏  举报