Android之ScrollLayout左右滑动效果实现

本文详细介绍了如何在Android中创建一个ScrollLayout,实现左右滑动的效果。首先,新建Android工程,接着添加必要的图片资源并设置相应效果。还涉及了视图改变接口的实现,提供了源码供读者下载参考。

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

本篇文章使用一个小程序实现Android之ScrollLayout左右滑动效果


第一步:新建Android工程

添加图片资源,并设置效果

<?xml version="1.0" encoding="utf-8"?>
<selector
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true" android:drawable="@drawable/page_indicator_unfocused" />
    <item android:state_enabled="false" android:drawable="@drawable/page_indicator_focused" />
</selector>

第二步:添加实现左右滑动效果的源文件

1.视图改变接口

public interface OnViewChangeListener {
	public void OnViewChange(int view);
}


2.实现左右滑动效果的源文件,以后我们可以直接使用这个文件

public class MyScrollLayout extends ViewGroup
{
	private static final String TAG = "ScrollLayout";
	private VelocityTracker mVelocityTracker;// 用于判断甩动手势
	private Scroller mScroller;// 滑动控制
	private int mCurScreen;
	private int mDefaultScreen = 0;
	private float mLastMotionX; // 手指移动的时候,或者手指离开屏幕的时候记录下的手指的横坐标
	private float mLastMotionY; // 手指移动的时候,或者手指离开屏幕的时候记录下的手指的纵坐标
	private int mTouchSlop;// 手指移动的最小距离的判断标准
							// =ViewConfiguration.get(getContext()).getScaledTouchSlop();
							// 在viewpapper中就是依赖于这个值来判断用户
							// 手指滑动的距离是否达到界面滑动的标准
	private static final int SNAP_VELOCITY = 600;// 默认的滚动速度,之后用于和手指滑动产生的速度比较,获取屏幕滚动的速度
	private static final int TOUCH_STATE_REST = 0;//表示触摸状态为空闲,即没有触摸或者手指离开了
	private static final int TOUCH_STATE_SCROLLING = 1;//表示手指正在移动
	private int mTouchState = TOUCH_STATE_REST;// 当前手指的事件状态
	
	private OnViewChangeListener mOnViewChangeListener;
	
	public MyScrollLayout(Context context)
	{
		super(context);
		Log.i(TAG, "---ScrollLyout1---");
		init(context);
	}
	public MyScrollLayout(Context context, AttributeSet attrs)
	{
		super(context, attrs);
		Log.i(TAG, "---ScrollLyout2---");
		init(context);
	}
	public MyScrollLayout(Context context, AttributeSet attrs, int defStyle)
	{
		super(context, attrs, defStyle);
		Log.i(TAG, "---ScrollLyout3---");
		init(context);
	}
	private void init(Context context)
	{
		mCurScreen = mDefaultScreen;
		mScroller = new Scroller(context);
		mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); // 使用系统默认的值
	}
	
	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b)
	{
		Log.i(TAG, "---onLayout---");
		// 为每一个孩子设置它们的位置
		if(changed)
		{
			int childLeft = 0;
			final int childCount = getChildCount();
			for(int i=0; i<childCount; i++)
			{
				final View childView = getChildAt(i);
				if (childView.getVisibility() != View.GONE)
				{
					// 此处获取到的宽度就是在onMeasure中设置的值
					final int childWidth = childView.getMeasuredWidth();
					// 为每一个子View布局
					childView.layout(childLeft, 0, childLeft+childWidth, childView.getMeasuredHeight());
					childLeft = childLeft + childWidth;
				}
			}
		}
	}
	
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
	{
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		Log.i(TAG
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值