重写viewgroup实现左右滑动(修改)

这篇博客介绍了一种自定义ViewGroup的方法,通过修改之前的代码,实现了左右滑动的功能。博主提到,虽然代码大部分已被重写,但基本思路与之前上下滑动的实现相同。更多详细的解析可以在博主关于上下滑动view的文章中找到。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这段代码是具有以前写过的代码修改的(其实是全部更改了,不过思路是一样的),更多的解析在我的那篇上下滑动view里,原理都是一样的

package com.java.zh_app.myviews;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Scroller;

import com.java.zh_app.R;

public class MyLRSlideViewGroup extends ViewGroup {
	private Scroller scroller;
	private final static int canTragviewDp = 60;
	private static int curr_view = 2, can_tragview = 0;
	private void Int_paras(Context context) {
		scroller = new Scroller(context);
		setBackgroundColor(context.getResources().getColor(R.color.app_orange_shallow_color));
		curr_view = 2;
		can_tragview = 0;
	}
	public MyLRSlideViewGroup(Context context) {
		super(context);
		Int_paras(context);
	}
	public MyLRSlideViewGroup(Context context, AttributeSet attrs) {
		super(context, attrs);
		Int_paras(context);
	}
	public MyLRSlideViewGroup(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		Int_paras(context);
	}
	@Override
	public void computeScroll() {
		if (scroller.computeScrollOffset()) {
			getChildAt(1).layout(scroller.getCurrX(), 0,
					scroller.getCurrX() + (getChildAt(1).getWidth()),
					getHeight());
			getChildAt(0).layout(
					scroller.getCurrX() - (getChildAt(1).getWidth()), 0,
					scroller.getCurrX(), getHeight());
			postInvalidate();
		}
		super.computeScroll();
	}
	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		int viewcount = getChildCount();
		for (int count = 0; count < viewcount; count++) {
			View child = getChildAt(count);
			int height = child.getMeasuredHeight();
			int wdith = child.getMeasuredWidth();
			child.layout(0, 0, wdith, height);
		}
	}
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		// TODO Auto-generated method stub
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		int width = MeasureSpec.getSize(widthMeasureSpec);
		int height = MeasureSpec.getSize(heightMeasureSpec);
		setMeasuredDimension(width, height);
		for (int i = 0; i < getChildCount(); i++) {
			getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
		}
	}

	public void ShowMenu(float currN, int dis) {
		scroller.startScroll((int) currN, 0, dis, 0);
		invalidate();
	}
	public void OpenMenu(float currN, float currX) {
		scroller.startScroll((int) currN, 0,
				(getWidth() - (int) currN), 0);
		invalidate();

	}

	public void CloseMenu(float currN, float currX) {
		scroller.startScroll((int) currN, 0, -(int) currN, 0);
		invalidate();
	}
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		super.dispatchTouchEvent(ev);
		switch (ev.getAction()) {
		case MotionEvent.ACTION_MOVE:
			if (can_tragview == 1) {
				ShowMenu(ev.getX(), 2);
			} else if (can_tragview == 2) {
				ShowMenu(ev.getX(), -2);
			}
			break;
		case MotionEvent.ACTION_UP:
			if (can_tragview != 0 && ev.getX() < getWidth() / 2) {
				CloseMenu(getX(), 0);
				can_tragview = 2;
				curr_view = 2;
			} else if (can_tragview != 0 && ev.getX() >= getWidth() / 2) {	
				OpenMenu(ev.getX(), 0);
				can_tragview = 1;
				curr_view = 1;
			}
			break;
		default:
			break;
		}
		return true;
	}
	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		super.onInterceptTouchEvent(ev);
		if (ev.getX() < canTragviewDp && curr_view == 2) {
			can_tragview = 1;
			return true;
		} else if (ev.getX() > (getWidth() - canTragviewDp) && curr_view == 1) {
			can_tragview = 2;
			return true;
		} else {
			can_tragview = 0;
		}
		return false;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值