【移动应用开发技术】Android ViewPager中如何显示图片与播放视频_第1页
【移动应用开发技术】Android ViewPager中如何显示图片与播放视频_第2页
【移动应用开发技术】Android ViewPager中如何显示图片与播放视频_第3页
【移动应用开发技术】Android ViewPager中如何显示图片与播放视频_第4页
【移动应用开发技术】Android ViewPager中如何显示图片与播放视频_第5页
已阅读5页,还剩15页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论