您的位置:首页 > 移动开发 > Android开发

Android关于SwipeLayout嵌套 ViewPager+Fragment,滑动冲突问题完美解决,模仿QQ右滑个人信息卡页面

2019-06-13 22:29 1961 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_36617198/article/details/91898305

Android关于SwipeLayout嵌套 ViewPager+Fragment,滑动冲突问题解决

前言
我是刚入门的android小白,最近在写一个小Demo的时候遇到了一个问题,如标题所言,百度了很久都没能找到想要的答案,也许我应该早点自己试着看看。
我的SwipeLayout里面也是正常的BottomView 和SurfaceView ,其中SurfaceView里面是ViewPager+Fragment 下面还有个TabLayout。

问题如下:


我的BottomView处于这个界面的底部,就是划开表层的view就能看见,可是我正常滑动的时候就会出现这个蓝色的边缘线,也就不能正常的划开表面的View,发生这种情况的概率也不低,严重影响体验。开始讲怎么解决。

首先添加viewpager页面变动监听,不多赘述。。。
下面代码中的viewPager就是我的ViewPager的实例化
swipeLayout就是SwipeLayout的实例化。。。

float nextOne = 0;	//记录viewpager滑动后将会跳转的下一个碎片
float position = 0;	//记录滑动时,当前的位置

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i1) {
if(i == 0) {
//当我向右边滑动时,滑动到下一个碎片时偏移值i1会增大,
//处于第一个碎片时,向右滑动此时偏移值i1不会增大,依然为0
//这个时候就可以判断出用户,下一步是想要滑动到下一个碎片,还是底层的V	iew
if (i1 > 0) {
nextOne = 1;	//下一个碎片
} else {
nextOne = 0;	//底层View
}
}
moveLine(i, v, 150);
}

@Override
public void onPageSelected(int i) {
position = i;			//每次页面变动时,当前viewpager的位置
changeTab(i);
if (i == 0) {
swipeLayout.setSwipeEnabled(true);
} else {
swipeLayout.setSwipeEnabled(false);
}
}

@Override
public void onPageScrollStateChanged(int i) { }
});

解释都写在注释了,不多
接下来写viewPager的触摸事件监听。。。

viewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, final MotionEvent event) {
//当前页面是第一个碎片,将要打开的下一个页面是底层View
if(nextOne == 0 && position == 0){
//这里开个线程去执行ontouchevent,避免抖动
new Thread(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
swipeLayout.onTouchEvent(event);
}
});
}
}).start();
return true;			//消化掉这次触摸事件
}
return false;
}
});

下面放我的布局看个大概就是了

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"
tools:showIn="@layout/activity_main">

<com.daimajia.swipe.SwipeLayout
android:id="@+id/swipe_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">

<!--BottomView 底层-->
<LinearLayout
android:id="@+id/information_card"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="left"
android:visibility="visible">

<include layout="@layout/information"></include>
</LinearLayout>

<!--SurfaceView 表层-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center">

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--这里是ViewPager -->
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_marginBottom="10dp"
android:layout_above="@id/line">

</android.support.v4.view.ViewPager>

<!--这里是Tablayout-->
<ImageView
android:id="@+id/line"
android:layout_width="150dp"
android:layout_height="5dp"
android:layout_above="@id/Tab"
android:layout_marginBottom="10dp"
android:background="@android:color/holo_green_light" />

<LinearLayout
android:id="@+id/Tab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_alignParentBottom="true"
android:visibility="visible">

<include layout="@layout/tab_layout"></include>
</LinearLayout>
</RelativeLayout>

</LinearLayout>

</com.daimajia.swipe.SwipeLayout>

</LinearLayout>

大问题算是解决了,但是还存在小问题,在切换到底层的时候,切换到一半然后手指按住不动,界面会有抖动,不过我觉得可以优化,后面做出来就更新。。。加油各位!

2019.06.14
昨天写好了博客今天就来加,已经解决了切换抖动的问题,开了个线程去执行swipeLayout的onTouchEvent就可以避免抖动了,这样减少了耗时操作(我是这样认为的),代码已更新。

ViewPager-onPageScrolled参数困惑
SwipeLayout 的使用

转载请注明出处https://blog.csdn.net/qq_36617198/article/details/91898305

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐