本篇文章使用一个小程序实现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);
}
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, "---onMeasure---");
// 在onlayout之前执行,获取View申请的大小,把它们保存下来,方面后面使用
final i