# InkeVerticalViewPagerLive
仿映客viewPager上下滑动切换直播demo
##效果预览
![Screenshot](art/inke.gif)
##APK地址
[InkeVerticalViewPagerLive-sample.apk](apk/InkeVerticalViewPagerLive-sample.apk)
##简述
经过几天对映客APP的分析研究,明白了映客上下滑动切换新的直播的实现原理,真心觉得做的挺赞的。。还是很流畅的,性能也很不错。
##思路
首先是一个主Activity,里面只有一个ViewPager,当然了这个viewPager得是VerticalViewPager的。可以参考这两个项目,https://github.com/kaelaela/VerticalViewPager ,
https://github.com/castorflex/VerticalViewPager , 请记住ViewPager使用的adapter得是PagerAdapter,而不能是FragmentPagerAdapter
```java
class PagerAdapter extends android.support.v4.view.PagerAdapter {
@Override
public int getCount() {
return mVideoUrls.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = LayoutInflater.from(container.getContext()).inflate(R.layout.view_room_item, null);
view.setId(position);
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(container.findViewById(position));
}
}
```
大致上就是这样的。 view_room_item.xml的布局,其实很简单,就是一个临时的布局,而不是我们真实的布局,贴一下布局代码吧
```xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/anchor_img"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_room_change"
android:scaleType="fitXY" />
</FrameLayout>
```
至于我们的真实业务的布局在哪呢,我们接下来会说道。viewPager上下切换中,创建的都是这个假的临时的布局,而且在整个viewPager起作用的过程中,始终就只有这一个真实业务的布局,viewPager默认会加载三个view,另外两个view都是假的,或者说是临时的view,而在这里,真实业务的布局就是我们的聊天室,以及texttureview
view_room_container.xml
```xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/room_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.pili.pldroid.player.widget.PLVideoTextureView
android:id="@+id/texture_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
```
我们是在什么地方把真实业务布局添加到viewPager中呢,可以看下面的一段代码
```java
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
Log.e(TAG, "mCurrentId == " + position + ", positionOffset == " + positionOffset +
", positionOffsetPixels == " + positionOffsetPixels);
mCurrentItem = position;
}
});
mViewPager.setPageTransformer(false, new ViewPager.PageTransformer() {
@Override
public void transformPage(View page, float position) {
ViewGroup viewGroup = (ViewGroup) page;
Log.e(TAG, "page.id == " + page.getId() + ", position == " + position);
if ((position < 0 && viewGroup.getId() != mCurrentItem)) {
View roomContainer = viewGroup.findViewById(R.id.room_container);
if (roomContainer != null && roomContainer.getParent() != null && roomContainer.getParent() instanceof ViewGroup) {
((ViewGroup) (roomContainer.getParent())).removeView(roomContainer);
}
}
// 满足此种条件,表明需要加载直播视频,以及聊天室了
if (viewGroup.getId() == mCurrentItem && position == 0 && mCurrentItem != mRoomId) {
if (mRoomContainer.getParent() != null && mRoomContainer.getParent() instanceof ViewGroup) {
((ViewGroup) (mRoomContainer.getParent())).removeView(mRoomContainer);
}
loadVideoAndChatRoom(viewGroup, mCurrentItem);
}
}
});
```
在PageTransformer里面,我们需要判断,每时每刻都只有一个真实业务的view,具体的判断条件可以参考这个demo,也可以自己做实验印证,主要的思路还是当滑动停止下来后,transformPage()方法中,当前选中的view的position==0,这个时候我们是需要加载直播视频和聊天室的,
而view不是我们选中的view的时候,也就是`position < 0 && viewGroup.getId() != mCurrentItem` 需要移除之前的真实业务布局。具体可以看上面的代码
大致原理就是如此了,请运行demo吧,有疑问,请提issue。
##总结
整体而言就是ViewPager加载的三个view中,有且只有一个view是拥有视频播放的textureview的,以及聊天室的fragment的,另外两个view都只是显示背景,没有其他的作用,在整个activity的生命过程中,始终只有这一个textutreview以及一个聊天室的fragment的,永远是复用的。这种情况下,就需要自己来控制不出现错位,混乱的问题,对映客的这种方式表示吊吊的 ^_^
##Thanks
视频播放使用的是https://github.com/pili-engineering/PLDroidPlayer ,感觉用起来还是不错的
上下滑动选用的是https://github.com/castorflex/VerticalViewPager ,没有选择另外一个的原因是滑动的产生的波纹效果还是左右方向的,当滑动到顶部或者是底部的时候
没有合适的资源?快使用搜索试试~ 我知道了~
Android代码-仿映客滑动切换直播
共53个文件
xml:18个
png:10个
java:6个
需积分: 50 6 下载量 148 浏览量
2019-08-08
06:50:59
上传
评论
收藏 19.64MB ZIP 举报
温馨提示
InkeVerticalViewPagerLive 仿映客viewPager上下滑动切换直播demo 效果预览 APK地址 InkeVerticalViewPagerLive-sample.apk 简述 经过几天对映客APP的分析研究,明白了映客上下滑动切换新的直播的实现原理,真心觉得做的挺赞的。。还是很流畅的,性能也很不错。 思路 首先是一个主Activity,里面只有一个ViewPager,当然了这个viewPager得是VerticalViewPager的。可以参考这两个项目,https://github.com/kaelaela/VerticalViewPager , https://github.com/castorflex/VerticalViewPager , 请记住ViewPager使用的adapter得是PagerAdapter,而不能是FragmentPagerAdapter class PagerAdapter extends android.support.v4.view.PagerAdapter { @Override p
资源推荐
资源详情
资源评论
收起资源包目录
Android代码-仿映客滑动切换直播.zip (53个子文件)
InkeVerticalViewPagerLive-master
gradlew.bat 2KB
gradlew 5KB
art
inke.gif 7.75MB
gradle.properties 730B
app
proguard-rules.pro 671B
src
test
java
com
star
inke
ExampleUnitTest.java 391B
androidTest
java
com
star
inke
ExampleInstrumentedTest.java 730B
main
res
mipmap-xxxhdpi
ic_launcher.png 10KB
drawable-hdpi
ic_rotate_right.png 2KB
ic_switch_screen.png 2KB
drawable-xhdpi
bg_room_change.png 266KB
drawable
transparent_selector.xml 383B
drawable-xxhdpi
video_zoomin.png 911B
close_.png 2KB
mipmap-hdpi
ic_launcher.png 3KB
values
colors.xml 766B
strings.xml 136B
styles.xml 3KB
dimens.xml 438B
mipmap-xxhdpi
ic_launcher.png 8KB
mipmap-mdpi
ic_launcher.png 2KB
mipmap-xhdpi
ic_launcher.png 5KB
layout
view_room_container.xml 592B
view_room_item.xml 440B
fragment_room.xml 6KB
activity_room.xml 438B
values-w820dp
dimens.xml 358B
jniLibs
armeabi-v7a
libpldroidplayer.so 1.94MB
armeabi
libpldroidplayer.so 2.53MB
arm64-v8a
libpldroidplayer.so 2.75MB
x86
libpldroidplayer.so 3.72MB
java
com
star
inke
MainActivity.java 12KB
RoomFragment.java 1KB
widget
MediaController.java 19KB
utils
Utils.java 743B
AndroidManifest.xml 1KB
.gitignore 7B
build.gradle 1KB
libs
pldroid-player-1.4.0.jar 169KB
gradle
wrapper
gradle-wrapper.jar 52KB
gradle-wrapper.properties 230B
.idea
gradle.xml 626B
runConfigurations.xml 564B
misc.xml 2KB
vcs.xml 180B
copyright
profiles_settings.xml 74B
modules.xml 387B
compiler.xml 686B
apk
InkeVerticalViewPagerLive-sample.apk 7.12MB
.gitignore 118B
README.md 6KB
settings.gradle 15B
build.gradle 502B
共 53 条
- 1
资源评论
普通网友
- 粉丝: 484
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功