版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】AndroidViewPager中如何显示图片与播放视频
ViewPager介绍ViewPager:一.需求来源与实现思路二.需要填的坑三.具体实现核心代码mAdapter
=
ImageBrowseFragmentPagerAdapter(supportFragmentManager,
this,
imgs)
imgs_viewpager.offscreenPageLimit
=
1
imgs_viewpager.adapter
=
mAdapter
imgs_viewpager.currentItem
=
mPosition
//为了处理首次点击时视频播放的问题
val
message
=
Message.obtain()
message.what
=
START_PLAY_VIDEO
mHandler.sendMessageDelayed(message,
200)private
val
START_PLAY_VIDEO
=
0
private
var
DELETE_VIDEO
=
1
private
var
DELETE_VIDEO_START_PLAY
=
2
private
var
mHandler
=
Handler(Handler.Callback
{
msg
->
when
(msg.what)
{
//开始播放视频
START_PLAY_VIDEO
->
NotifyDispatch.dispatch(PreviewPlayVideoEvent(mPosition))
//删除视频时刷新ui
DELETE_VIDEO
->
{
mAdapter?.setImgs(imgs)
}
//解决删除视频时之后跳转到另一个item,当它是视频时不继续播放的问题
DELETE_VIDEO_START_PLAY
->
NotifyDispatch.dispatch(PreviewPlayVideoEvent(mDeletePosition))
}
true
})
private
fun
deletePhotos(position:
Int)
{
if
(imgs!!.isEmpty())
{
return
}
ThreadDispatch.right_now.execute({
var
file:
File?
file
=
File(imgs.get(position))
if
(file
!=
null
&&
file?.exists()!!)
{
val
intent
=
Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
val
uri
=
Uri.fromFile(file)
intent.data
=
uri
sendBroadcast(intent)
file?.delete()
imgs.removeAt(position)
}
if
(position
==
imgs.size)
{
mDeletePosition
=
position
-
1
}
else
{
mDeletePosition
=
position
}
val
message
=
Message.obtain()
message.what
=
DELETE_VIDEO
mHandler.sendMessage(message)
NotifyDispatch.dispatch(DeletePreviewPhotoEvent(imgs))
val
message1
=
Message.obtain()
message1.what
=
DELETE_VIDEO_START_PLAY
mHandler.sendMessageDelayed(message1,
200)
if
(imgs.isEmpty())
{
finish()
}
})
//
}
}package
com.immomo.camerax.gui.view.adapter;
import
android.content.Context;
import
android.os.Bundle;
import
android.support.v4.app.Fragment;
import
android.support.v4.app.FragmentManager;
import
android.support.v4.app.FragmentStatePagerAdapter;
import
android.support.v4.app.FragmentTransaction;
import
android.view.View;
import
android.view.ViewGroup;
import
com.immomo.camerax.gui.fragment.PreviewImgFragment;
import
com.immomo.camerax.gui.fragment.PreviewVideoFragment;
import
java.util.ArrayList;
import
java.util.List;
/**
*
Created
by
liuxu
on
2018/3/26.
*/
public
class
ImageBrowseFragmentPagerAdapter
extends
FragmentStatePagerAdapter
{
private
Context
mContext;
private
List<String>
datas;
private
int
mCurrentSelectedPosition
=
-1;
private
FragmentManager
mFragmentManager;
private
FragmentTransaction
mFragmentTransaction;
private
ArrayList<Fragment>
mFragments
=
new
ArrayList<>();
public
ImageBrowseFragmentPagerAdapter(FragmentManager
fm,
Context
context,
List<String>
datas)
{
super(fm);
mFragmentManager
=
fm;
mContext
=
context;
this.datas
=
datas;
}
public
void
removeContext(){
mContext
=
null;
}
@Override
public
void
setPrimaryItem(ViewGroup
container,
int
position,
Object
object)
{
mCurrentSelectedPosition
=
position;
}
@Override
public
void
startUpdate(ViewGroup
container)
{
super.startUpdate(container);
}
public
void
setImgs(List<String>
imgs)
{
this.datas
=
imgs;
notifyDataSetChanged();
}
//处理更新无效删除条目
@Override
public
int
getItemPosition(Object
object)
{
return
POSITION_NONE;
}
public
int
getPrimaryItemPosition()
{
return
mCurrentSelectedPosition;
}
public
ImageBrowseFragmentPagerAdapter(FragmentManager
fm)
{
super(fm);
}
@Override
public
boolean
isViewFromObject(View
view,
Object
object)
{
return
view
==
((Fragment)
object).getView();
}
@Override
public
Fragment
getItem(int
position)
{
Bundle
bundle
=
new
Bundle();
bundle.putString("url",
datas.get(position));
bundle.putInt("position",
position);
if
(datas.get(position).endsWith(".jpg"))
{
PreviewImgFragment
previewImgFragment
=
new
PreviewImgFragment();
previewImgFragment.setArguments(bundle);
return
previewImgFragment;
}
else
{
PreviewVideoFragment
previewVideoFragment
=
new
PreviewVideoFragment();
previewVideoFragment.setArguments(bundle);
return
previewVideoFragment;
}
}
@Override
public
int
getCount()
{
return
datas
==
null
?
0
:
datas.size();
}
@Override
public
Object
instantiateItem(ViewGroup
container,
int
position)
{
return
super.instantiateItem(container,position);
}
@Override
public
void
destroyItem(ViewGroup
container,
int
position,
Object
object)
{
super.destroyItem(container,position,object);
}
}package
com.immomo.camerax.gui.fragment;
import
android.os.Bundle;
import
android.support.annotation.Nullable;
import
android.support.v4.app.Fragment;
import
android.view.LayoutInflater;
import
android.view.View;
import
android.view.ViewGroup;
import
com.bumptech.glide.Glide;
import
com.immomo.camerax.R;
import
com.immomo.camerax.foundation.util.StatusBarUtils;
import
com.immomo.camerax.gui.view.ResizablePhotoView;
/**
*
Created
by
liuxu
on
2018/3/27.
*/
public
class
PreviewImgFragment
extends
Fragment
{
@Nullable
@Override
public
View
onCreateView(LayoutInflater
inflater,
@Nullable
ViewGroup
container,
@Nullable
Bundle
savedInstanceState)
{
View
view
=
inflater.inflate(R.layout.fragment_preview_photo,
null);
ResizablePhotoView
resizablePhotoView
=
view.findViewById(R.id.customPhotoView);
String
url
=
getArguments().getString("url");
Glide.with(getContext()).load(url).into(resizablePhotoView);
resizablePhotoView.setOnClickListener(new
View.OnClickListener()
{
@Override
public
void
onClick(View
view)
{
getActivity().finish();
}
});
return
view;
}
@Override
public
void
onPause()
{
super.onPause();
}
@Override
public
void
onResume()
{
super.onResume();
}
@Override
public
void
onDetach()
{
super.onDetach();
}
@Override
public
void
onDestroyView()
{
super.onDestroyView();
}
@Override
public
void
onStart()
{
super.onStart();
}
@Override
public
void
onDestroy()
{
super.onDestroy();
}
@Override
public
void
setUserVisibleHint(boolean
isVisibleToUser)
{
super.setUserVisibleHint(isVisibleToUser);
}
}package
com.immomo.camerax.gui.view;
import
android.content.Context;
import
android.graphics.drawable.Drawable;
import
android.util.AttributeSet;
import
com.github.chrisbanes.photoview.PhotoView;
/**
*
Created
by
liuxu
on
2018/4/7.
*/
public
class
ResizablePhotoView
extends
PhotoView
{
public
ResizablePhotoView(Context
context)
{
super(context);
}
public
ResizablePhotoView(Context
context,
AttributeSet
attr)
{
super(context,
attr);
}
public
ResizablePhotoView(Context
context,
AttributeSet
attr,
int
defStyle)
{
super(context,
attr,
defStyle);
}
@Override
protected
void
onMeasure(int
widthMeasureSpec,
int
heightMeasureSpec)
{
Drawable
d
=
getDrawable();
if
(d
!=
null){
int
width
=
MeasureSpec.getSize(widthMeasureSpec);
//高度根据使得图片的宽度充满屏幕计算而得
int
height
=
(int)
Math.ceil((float)
width
*
(float)
d.getIntrinsicHeight()
/
(float)
d.getIntrinsicWidth());
setMeasuredDimension(width,
height);
}else
{
super.onMeasure(widthMeasureSpec,
heightMeasureSpec);
}
}
}/**
*
Created
by
liuxu
on
2018/3/27.
*/
public
class
PreviewVideoFragment
extends
Fragment
{
private
ImageView
mPhotoView;
private
TextureView
mTextureView;
private
String
mUrl;
private
int
mPosition;
private
AndroidMediaPlayer
mIjkVodMediaPlayer;
private
boolean
mIsSelected;
private
boolean
mIsFirstPrepared;
private
PreviewPlayVideoSubscriber
mPreviewPlayVideoSubscriber
=
new
PreviewPlayVideoSubscriber()
{
@Override
public
void
onEventMainThread(PreviewPlayVideoEvent
event)
{
super.onEventMainThread(event);
MDLog.e("liuxu",event.getPosition()+"");
if
(event
!=
null
&&
event.getPosition()
==
mPosition)
{
//说明是当前条目
if
(mIjkVodMediaPlayer
!=
null
&&
!mIjkVodMediaPlayer.isPlaying())
{
if
(mTextureView
!=
null)
{
mIjkVodMediaPlayer.setSurface(mSurface);
mIjkVodMediaPlayer.prepareAsync();
mPhotoView.setVisibility(View.VISIBLE);
}
}
mIsSelected
=
true;
}
else
{
if
(mIjkVodMediaPlayer
!=
null
&&
mIjkVodMediaPlayer.isPlaying())
{
mIjkVodMediaPlayer.pause();
mIjkVodMediaPlayer.stop();
}
if
(mPhotoView
!=
null)
{
mPhotoView.setVisibility(View.VISIBLE);
}
mIsSelected
=
false;
}
}
};
private
String
mWidth;
private
String
mHeight;
@Nullable
@Override
public
View
onCreateView(LayoutInflater
inflater,
@Nullable
ViewGroup
container,
@Nullable
Bundle
savedInstanceState)
{
mPreviewPlayVideoSubscriber.register();
View
view
=
inflater.inflate(R.layout.fragment_preview_video,
null);
mPhotoView
=
view.findViewById(R.id.photoView);
mTextureView
=
view.findViewById(R.id.surfaceView);
mUrl
=
getArguments().getString("url");
mPosition
=
getArguments().getInt("position");
layoutPlayer();
loadVideoScreenshot(getContext(),
mUrl,
mPhotoView,
1);
view.setOnClickListener(new
View.OnClickListener()
{
@Override
public
void
onClick(View
view)
{
release();
getActivity().finish();
}
});
initTextureMedia();
return
view;
}
private
void
initTextureMedia()
{
mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
}
private
void
play(String
url)
{
try
{
mIjkVodMediaPlayer
=
new
AndroidMediaPlayer();
mIjkVodMediaPlayer.reset();
mIjkVodMediaPlayer.setDataSource(url);
//让MediaPlayer和TextureView进行视频画面的结合
mIjkVodMediaPlayer.setSurface(mSurface);
//设置监听
mIjkVodMediaPlayer.setOnBufferingUpdateListener((mp,
percent)
->
{
});
mIjkVodMediaPlayer.setOnCompletionListener(mp
->
{
mp.seekTo(0);
mp.start();
});
mIjkVodMediaPlayer.setOnInfoListener((mp1,
what,
extra)
->
{
if
(what
==
IMediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START)
{
mPhotoView.setVisibility(View.GONE);
mIsFirstPrepared
=
true;
}
return
false;
});
mIjkVodMediaPlayer.setOnErrorListener((mp,
what,
extra)
->
false);
mIjkVodMediaPlayer.setOnPreparedListener(mp
->
{
mp.start();
if
(!mIsFirstPrepared){
}else
{
mPhotoView.setVisibility(View.GONE);
}
});
mIjkVodMediaPlayer.setScreenOnWhilePlaying(true);//在视频播放的时候保持屏幕的高亮
if
(mIsSelected){
//异步准备
mIjkVodMediaPlayer.prepareAsync();
}
}
catch
(Exception
e)
{
e.printStackTrace();
}
}
private
Surface
mSurface;
private
TextureView.SurfaceTextureListener
mSurfaceTextureListener
=
new
TextureView.SurfaceTextureListener()
{
@Override
public
void
onSurfaceTextureAvailable(SurfaceTexture
surface,
int
width,
int
height)
{
mSurface
=
new
Surface(surface);
play(mUrl);
}
@Override
public
void
onSurfaceTextureSizeChanged(SurfaceTexture
surface,
int
width,
int
height)
{
}
@Override
public
boolean
onSurfaceTextureDestroyed(SurfaceTexture
surface)
{
if
(mSurface
!=
null){
mSurface.release();
mSurface
=
null;
}
if
(mTextureView
!=
null){
if
(Build.VERSION.SDK_INT
>=
Build.VERSION_CODES.O)
{
mTextureView.releasePointerCapture();
}
}
release();
return
false;
}
@Override
public
void
onSurfaceTextureUpdated(SurfaceTexture
surface)
{
}
};
@Override
public
void
onStart()
{
super.onStart();
}
@Override
public
void
onAttach(Context
context)
{
super.onAttach(context);
}
@Override
public
void
onDetach()
{
super.onDetach();
}
@Override
public
void
onPause()
{
MDLog.e("liuxu",
"onPause"
+
mPosition);
//处理锁屏时播放器停止播放
if
(mIjkVodMediaPlayer
!=
null
&&
mIjkVodMediaPlayer.isPlaying()){
mIjkVodMediaPlayer.pause();
mIjkVodMediaPlayer.stop();
}
super.onPause();
}
//屏幕打开时重新播放
@Override
public
void
onResume()
{
MDLog.e("liuxu",
"onResume"
+
mPosition);
super.onResume();
if
(mIsSelected
&&
mIjkVodMediaPlayer
!=
null
&&
!mIjkVodMediaPlayer.isPlaying())
{
mIjkVodMediaPlayer.prepareAsync();
}
}
@Override
public
void
onDestroy()
{
MDLog.e("liuxu",
"onDestroy");
release();
if
(mPreviewPlayVideoSubscriber.isRegister())
{
mPreviewPlayVideoSubscriber.unregister();
}
super.onDestroy();
}
private
void
release()
{
if
(mIjkVodMediaPlayer
==
null)
{
return;
}
if
(mIjkVodMediaPlayer.isPlaying())
{
mIjkVodMediaPlayer.stop();
}
mIjkVodMediaPlayer.release();
mIjkVodMediaPlayer
=
null;
}
@Override
public
boolean
getUserVisibleHint()
{
return
super.getUserVisibleHint();
}
/**
*
动态设置视频宽高信息
*/
private
void
layoutPlayer()
{
//获取视频宽高比
getPlayInfo(mUrl);
float
ratio
=
Float.parseFloat(mHeight)
/
Float.parseFloat(mWidth);
MDLog.e("type",
mPosition
+
"ratio"
+
ratio);
int
type
=
0;
//添加容错值
if
(ratio
<
MediaConstants.INSTANCE.getASPECT_RATIO_1_1().toFloat()
+
MediaConstants.INSTANCE.getSCREEN_DEFAULT_VALUE()
&&
ratio
>
MediaConstants.INSTANCE.getASPECT_RATIO_1_1().toFloat()
-
MediaConstants.INSTANCE.getSCREEN_DEFAULT_VALUE())
{
type
=
ScreenAdapterUtils.INSTANCE.getSCALE_TYPE_11();
}
else
if
(ratio
<
MediaConstants.INSTANCE.getASPECT_RATIO_4_3().toFloat()
+
MediaConstants.INSTANCE.getSCREEN_DEFAULT_VALUE()
&&
ratio
>
MediaConstants.INSTANCE.getASPECT_RATIO_4_3().toFloat()
-
MediaConstants.INSTANCE.getSCREEN_DEFAULT_VALUE())
{
type
=
ScreenAdapterUtils.INSTANCE.getSCALE_TYPE_43();
MDLog.e("type",
"43");
}
else
if
(ratio
<
MediaConstants.INSTANCE.getASPECT_RATIO_16_9().toFloat()
+
MediaConstants.INSTANCE.getSCREEN_DEFAULT_VALUE()
&&
ratio
>
MediaConstants.INSTANCE.getASPECT_RATIO_16_9().toFloat()
-
MediaConstants.INSTANCE.getSCREEN_DEFAULT_VALUE())
{
type
=
ScreenAdapterUtils.INSTANCE.getSCALE_TYPE_169();
MDLog.e("type",
"169");
}
FrameLayout.LayoutParams
layoutParams
=
(FrameLayout.LayoutParams)
mTextureView.getLayoutParams();
layoutParams.height
=
ScreenAdapterUtils.INSTANCE.getSurfaceHeight(type);
mTextureView.setLayoutParams(layoutParams);
FrameLayout.LayoutParams
params
=
(FrameLayout.LayoutParams)
mPhotoView.getLayoutParams();
params.height
=
S
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外研八下英语Unit 1 Starting out-Understanding ideas《合作探究二》课件
- (新教材)2026人教版二年级下册数学 练一练p31-p32 课件
- 2025 高中信息技术数据结构在智能家居能源消耗预测与管理课件
- 2026年员工参股合同(1篇)
- 2026年借款及担保合同(1篇)
- 预制菜发展可行性研究报告
- 粮食烘干塔项目可行性研究报告
- 2026年及未来5年市场数据中国增效磷行业发展监测及投资战略咨询报告
- 信息技术教师资格证中计算机系统的工作原理
- 四川省德阳市高中2023级第二次诊断考试数学(含答案)
- 单兵战术动作低姿匍匐前进教案
- 2025新人教版七年级下册英语 Unit 8知识点梳理及语法讲义(答案版)
- 水库安全管理培训
- 2024年数智工程师职业鉴定考试复习题库(含答案)
- 工程劳务外包合同范本大全
- 统编版语文四年级下册 第一单元基础过关卷(试题)
- 自考《13180操作系统》考前强化练习试题库及答案
- 人工智能芯片设计 课件 周巍 第4-7章-人工智能与深度学习 -人工智能芯片架构设计
- 医院患者安全与防范措施管理规章制度
- DB34∕T 3463-2019 钢筋桁架楼承板系统应用技术规程
- 人教A版2019必修第一册专题3.2函数的基本性质【十大题型】(原卷版+解析)
评论
0/150
提交评论