【发布时间】:2017-12-01 19:52:52
【问题描述】:
我需要为照片和视频标签使用相同的片段,并且仍然有三个标签。 我在 viewpager 中有两个片段,在 tablayout 中有 3 个选项卡。我想实现像instagram这样的viewpager改变效果。我做了什么: 我在下面创建了自定义 viewpager:
public class SwipableViewPager extends ViewPager {
private float downX;
private float downY;
private float mStartDragX;
private float upX;
private float upY;
private boolean dragDisabled;
private SwipeListener mListener;
public void setSwipeListener(SwipeListener listener) {
mListener = listener;
}
public SwipableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
float x = ev.getX();
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = ev.getX();
downY = ev.getY();
mStartDragX = x;
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
upX = ev.getX();
upY = ev.getY();
float deltaX = downX - upX;
if(deltaX>-getWidth() && deltaX< -getWidth()/4 && getCurrentItem() == getAdapter().getCount() - 1){
mListener.setPageAndEnableDrag();
}
break;
case MotionEvent.ACTION_MOVE:
if (mStartDragX - 30 > x && getCurrentItem() == getAdapter().getCount() - 1) {
mListener.onSwipeOutAtEnd();
}
break;
}
if(dragDisabled) {
return false;
}
else{
return super.onInterceptTouchEvent(ev);
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if(dragDisabled) return false;
return super.onTouchEvent(ev);
}
public void disableDrag(boolean disabled) {
dragDisabled = disabled;
}
public interface SwipeListener {
void setPageAndEnableDrag();
void onSwipeOutAtEnd();
}
}
当当前项目是适配器中的最后一个项目时,它将通知向右滑动(当您在照片选项卡中并且想要通过滑动进入视频选项卡时需要这样做)。 在活动中,我这样设置 viewpager:
private void setupViewPager() {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(GalleryFragment.newInstance(), getResources().getString(R.string.gallery_toolbar_title));
TakePhotoFragment fragment = new TakePhotoFragment();
adapter.addFragment(fragment, getResources().getString(R.string.photo));
viewPager.setAdapter(adapter);
viewPager.setSwipeListener(this);
tabLayout.setupWithViewPager(viewPager);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
switch (tab.getPosition()){
case 1: //selected photo tab
viewPager.setCurrentItem(1);
toolbar.setTitle(R.string.photo);
viewPager.disableDrag(false); //switch on default swipe
break;
case 2: // selected video tab
toolbar.setTitle(R.string.video);
viewPager.disableDrag(true); // switch off default swipe
break;
default: // selected gallery tab
viewPager.setCurrentItem(tab.getPosition());
toolbar.setTitle(R.string.gallery_toolbar_title);
viewPager.disableDrag(false); //switch on default swipe
break;
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
@Override
public void setPageAndEnableDrag() {
tabLayout.getTabAt(1).select();
viewPager.disableDrag(false);
}
public void setPagerEnabledDrag(boolean enabled) {
viewPager.disableDrag(!enabled);
}
@Override
public void onSwipeOutAtEnd() {
viewPager.disableDrag(true);
tabLayout.getTabAt(2).select();
}
一切都好,但是当您在画廊标签中并且如果您想进入视频标签时,您无法通过单击视频标签来完成。当您首先单击视频选项卡时,它会激活照片选项卡,然后如果您再单击视频选项卡,它将激活视频选项卡。还可以通过刷丑来改变照片标签和视频标签。 我需要实现点击视频标签时它必须转到视频标签而不是像现在这样的照片标签。
另见视频: https://youtu.be/tbT7mzkmydQ
- 为什么我只有两个片段,但有三个选项卡? 因为 Camera 对象只能在一个 Activity 中创建,所以我必须为照片和视频选项卡使用一个片段。
- 为什么我必须处理无法拖动的问题? 当用户转到第三个选项卡时,我必须禁用 viewpager 的默认滑动效果(如果我不这样做,从第三个选项卡滑动到第二个 viewpager 时将转到第一个选项卡)
- 我不想要无限的浏览器。
- 我不想简单地从右侧(第三个)片段转到左侧(第一个)片段。
【问题讨论】:
-
我对您的问题有了一个模糊的认识。如果您仅使用“第一”、“第二”和“第三”来编辑完整问题,将会有所帮助。我仍然不明白:当你从一个相机片段转到另一个相机片段时,你想发生什么?选项卡当然应该改变,但是分页器中应该有滑动动画吗?之间是什么?还是你不想发生任何事情?另外,你为什么要刷卡。你不应该处理适配器吗?你能展示你的实现吗?另外,只有两个片段,你如何首先获得三个选项卡?
-
当您点击视频标签时,它会转到照片标签。单击第二次后,它将转到视频选项卡。你用过 Instagram 吗?
-
你能发布一段你想要实现的视频吗?