侧屏滑动显示另一屏的一部分,应该可以想到使用的布局是FrameLayout(堆栈布局),因此自定义一个FrameLayout,对其中进行操控即可实现。
1.使用自定义在xml中新建两个FrameLayout
2.在继承FrameLayout中定义两个view,分别指向xml建立的两个FrameLayout
3.使用ViewDragHelper,将ontouchevent事件转向ViewDragHelper
4.对ViewDragHelper中事件处理
其中涉及到了平滑移动的函数
代码根据Android群英传改写
xml布局文件
<com.example.administrator.qyz502.DragViewGroup
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_blue_bright">
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_orange_dark">
</FrameLayout>
</com.example.administrator.qyz502.DragViewGroup>
public class DragViewGroup extends FrameLayout {
private ViewDragHelper viewDragHelper;
private View menuView,mainView;
private int width;
public DragViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
public DragViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public DragViewGroup(Context context) {
super(context);
initView();
}
//因为继承的是堆栈布局,因此FrameLayout是层叠的,在xml中建立两个frame布局,下面分别赋给view
@Override
protected void onFinishInflate() {
super.onFinishInflate();
menuView=getChildAt(0);
mainView=getChildAt(1);
}
//当大小改变时,调用
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
width=menuView.getMeasuredWidth();
}
//android拦截机制,不过我觉得对于此程序第一个应该是没有用的
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return viewDragHelper.shouldInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
viewDragHelper.processTouchEvent(event);
return true;
}
//viewDragHelper的创建
private void initView(){
viewDragHelper=ViewDragHelper.create(this,callback);
}
//这个指定的是mainView可以移动
private ViewDragHelper.Callback callback=new ViewDragHelper.Callback() {
@Override
public boolean tryCaptureView(View child, int pointerId) {
return mainView==child;
}
//实现滑动效果,水平向左
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
return left;
}
//当手指离开时执行动作
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
super.onViewReleased(releasedChild, xvel, yvel);
if(mainView.getLeft()<200){
viewDragHelper.smoothSlideViewTo(mainView,0,0);
ViewCompat.postInvalidateOnAnimation(DragViewGroup.this);
}else{
viewDragHelper.smoothSlideViewTo(mainView,300,0);//mainView从300滑动到0
ViewCompat.postInvalidateOnAnimation(DragViewGroup.this);
}
}
};
//对滑动的处理,和上面相同的两行都是对滑动的处理,要调用下面的函数
@Override
public void computeScroll() {
if(viewDragHelper.continueSettling(true)){
ViewCompat.postInvalidateOnAnimation(this);
}
}
}
本人代码地址见
https://github.com/moluchase/Android