@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
int x=(int)ev.getX();
int y=(int)ev.getY();
boolean intercept=false;
switch (ev.getAction()){
//按下事件不要拦截,否则后续事件都会给ViewGroup处理
case MotionEvent.ACTION_DOWN:
intercept=false;
break;
case MotionEvent.ACTION_MOVE:
//如果是横向移动就进行拦截,否则不拦截
int deltaX=x-mLastX;
int deltaY=y-mLastY;
if(父容器需要当前点击事件){
intercept=true;
}else {
intercept=false;
}
break;
case MotionEvent.ACTION_UP:
intercept=false;
break;
}
mLastX = x;
mLastY = y;
return intercept;
}
public class MainActivity extends Activity{
private HorizontalScrollView mListContainer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
LayoutInflater inflater = getLayoutInflater();
mListContainer = (HorizontalScrollView) findViewById(R.id.container);
final int screenWidth = MyUtils.getScreenMetrics(this).widthPixels;
for (int i = 0; i < 3; i++) {
ViewGroup layout = (ViewGroup) inflater.inflate(
R.layout.content_layout, mListContainer, false);
layout.getLayoutParams().width = screenWidth;
TextView textView = (TextView) layout.findViewById(R.id.title);
textView.setText("page " + (i + 1));
layout.setBackgroundColor(Color.rgb(255 / (i + 1), 255 / (i + 1), 0));
createList(layout);
mListContainer.addView(layout);
}
}
private void createList(ViewGroup layout) {
ListView listView = (ListView) layout.findViewById(R.id.list);
ArrayList<String> datas = new ArrayList<>();
for (int i = 0; i < 50; i++) {
datas.add("name " + i);
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.content_list_item, R.id.name, datas);
listView.setAdapter(adapter);
}
}
/**
* 横向布局控件
* 模拟经典滑动冲突
* 我们此处使用ScrollView来模拟ViewPager,那么必须手动处理滑动冲突,否则内外两层只能有一层滑动,那就是滑动冲突。另外内部左右滑动,外部上下滑动也同样属于该类
*/
public class HorizontalScrollView extends ViewGroup {
//记录上次滑动的坐标
private int mLastX = 0;
private int mLastY = 0;
private WindowManager wm;
//子View的个数
private int mChildCount;
private int mScreenWidth;
//自定义控件横向宽度
private int mMeasureWidth;
//滑动加载下一个界面的阈值
private int mCrital;
//滑动辅助类
private Scroller mScroller;
//当前展示的子View的索引
private int showViewIndex;
public HorizontalScrollView(Context context){
this(context,null);
}
public HorizontalScrollView(Context context, AttributeSet attributeSet){
super(context,attributeSet);
init(context);
}
/**
* 初始化
* @param context
*/
public void init(Context context) {
//读取屏幕相关的长宽
wm = ((Activity)context).getWindowManager();
mScreenWidth = wm.getDefaultDisplay().getWidth();
mCrital=mScreenWidth/4;
mScroller=new Scroller(context);
showViewIndex=1;
}
/**
* 重新事件拦截机制
* 我们分析了view的事件分发,我们知道点击事件的分发顺序是 通过父布局分发,如果父布局没有拦截,即onInterceptTouchEvent返回false,
* 才会传递给子View。所以我们就可以利用onInterceptTouchEvent()这个方法来进行事件的拦截。来看一下代码
* 此处使用外部拦截法
* @param ev
* @return
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
int x=(int)ev.getX();
int y=(int)ev.getY();
boolean intercept=false;
switch (ev.getAction()){
//按下事件不要拦截,否则后续事件都会给ViewGroup处理
case MotionEvent.ACTION_DOWN:
intercept=false;
if(!mScroller.isFinished()){
mScroller.abortAnimation();
intercept=true;
}
break;
case MotionEvent.ACTION_MOVE:
//如果是横向移动就进行拦截,否则不拦截
int deltaX=x-mLastX;
int deltaY=y-mLastY;
if(Math.abs(deltaX)>Math.abs(deltaY)){
intercept=true;
}else {
intercept=false;
}
break;
case MotionEvent.ACTION_UP:
intercept=false;
break;
}
mLastX = x;
mLastY = y;
return intercept;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if(!mScroller.isFinished()){
mScroller.abortAnimation();
}
break;
case MotionEvent.ACTION_MOVE:
int deltaX = x - mLastX;
/**
* scrollX是指ViewGroup的左侧边框和当前内容左侧边框之间的距离
*/
int scrollX=getScrollX();
if(scrollX-deltaX>0
&& (scrollX-deltaX)<=(mMeasureWidth-mScreenWidth)) {
scrollBy(-deltaX, 0);
}
break;
case MotionEvent.ACTION_UP:
scrollX=getScrollX();
int dx;
//计算滑动的差值,如果超过1/4就滑动到下一页
int subScrollX=scrollX-((showViewIndex-1)*mScreenWidth);
if(Math.abs(subScrollX)>=mCrital){
boolean next=scrollX>(showViewIndex-1)*mScreenWidth;
if(showViewIndex<3 && next) {
showViewIndex++;
}else {
showViewIndex--;
}
}
dx=(showViewIndex - 1) * mScreenWidth - scrollX;
smoothScrollByDx(dx);
break;
}
mLastX = x;
mLastY = y;
return true;
}
/**
* 缓慢滚动到指定位置
* @param dx
*/
private void smoothScrollByDx(int dx) {
//在1000毫秒内滑动dx距离,效果就是慢慢滑动
mScroller.startScroll(getScrollX(), 0, dx, 0, 1000);
invalidate();
}
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
postInvalidate();
}
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有