Android本地视频播放器开发--搜索本地视频(1)中我们获取了本地视频的数据,在这一章里面,我们将获取的数据通过LIstView来动态的实现出来。

1、首先介绍布局代码,主布局代码只含有一个LIstView --jie_video.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent" ><ListViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentBottom="true"android:id="@+id/jievideolistfile"/></RelativeLayout>

2、下一个布局就是listView的子项的布局

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content" >    <ImageView         android:layout_width="120dp"        android:layout_height="80dp"        android:id="@+id/video_img"        android:contentDescription="@string/cont"        />    <RelativeLayout         android:layout_width="match_parent"    android:layout_height="match_parent"    android:layout_toRightOf="@id/video_img"    android:layout_alignBottom="@id/video_img"        >        <TextView     android:layout_width="match_parent"    android:layout_height="wrap_content"    android:id="@+id/video_title"    android:gravity="center"    android:layout_marginTop="5dp"    android:text="@string/title"    />        <TextView     android:layout_width="match_parent"    android:layout_height="wrap_content"    android:id="@+id/video_time"    android:gravity="center"    android:layout_alignParentBottom="true"    android:layout_marginBottom="5dp"    android:text="@string/time"    />    </RelativeLayout></RelativeLayout>


3、布局都写好了,然后就是Activity的编写,这里涉及到视频的缩略图的显示,所以要用到异步加载功能

JieVideo.java

package com.zhangjie.graduation.videopalyer;import java.util.List;import com.zhangjie.graduation.videopalyer.component.JieVideoListViewAdapter;import com.zhangjie.graduation.videopalyer.component.LoadedImage;import com.zhangjie.graduation.videopalyer.videofile.AbstructProvider;import com.zhangjie.graduation.videopalyer.videofile.Video;import com.zhangjie.graduation.videopalyer.videofile.VideoProvider;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.drawable.BitmapDrawable;import android.media.ThumbnailUtils;import android.os.AsyncTask;import android.os.Bundle;import android.provider.MediaStore.Video.Thumbnails;import android.view.View;import android.widget.AdapterView;import android.widget.ImageView;import android.widget.ListView;import android.widget.AdapterView.OnItemClickListener;public class JieVideo extends Activity{public JieVideo instance = null;ListView mJieVideoListView;JieVideoListViewAdapter mJieVideoListViewAdapter;List<Video> listVideos;int videoSize;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.jie_video);instance = this;AbstructProvider provider = new VideoProvider(instance);        listVideos = provider.getList();        videoSize = listVideos.size();mJieVideoListViewAdapter = new JieVideoListViewAdapter(this, listVideos);mJieVideoListView = (ListView)findViewById(R.id.jievideolistfile);mJieVideoListView.setAdapter(mJieVideoListViewAdapter);mJieVideoListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {Intent intent = new Intent();intent.setClass(JieVideo.this, JieVideoPlayer.class);Bundle bundle = new Bundle();bundle.putSerializable("video", listVideos.get(position));intent.putExtras(bundle);startActivity(intent);}});loadImages();}/** * Load images. */private void loadImages() {final Object data = getLastNonConfigurationInstance();if (data == null) {new LoadImagesFromSDCard().execute();} else {final LoadedImage[] photos = (LoadedImage[]) data;if (photos.length == 0) {new LoadImagesFromSDCard().execute();}for (LoadedImage photo : photos) {addImage(photo);}}}private void addImage(LoadedImage... value) {for (LoadedImage image : value) {mJieVideoListViewAdapter.addPhoto(image);mJieVideoListViewAdapter.notifyDataSetChanged();}}@Overridepublic Object onRetainNonConfigurationInstance() {final ListView grid = mJieVideoListView;final int count = grid.getChildCount();final LoadedImage[] list = new LoadedImage[count];for (int i = 0; i < count; i++) {final ImageView v = (ImageView) grid.getChildAt(i);list[i] = new LoadedImage(((BitmapDrawable) v.getDrawable()).getBitmap());}return list;}/**     * 获取视频缩略图     * @param videoPath     * @param width     * @param height     * @param kind     * @return     */     private Bitmap getVideoThumbnail(String videoPath, int width , int height, int kind){      Bitmap bitmap = null;      bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, kind);      bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);      return bitmap;     }  class LoadImagesFromSDCard extends AsyncTask<Object, LoadedImage, Object> {@Overrideprotected Object doInBackground(Object... params) {Bitmap bitmap = null;for (int i = 0; i < videoSize; i++) {bitmap = getVideoThumbnail(listVideos.get(i).getPath(), 120, 120, Thumbnails.MINI_KIND);if (bitmap != null) {publishProgress(new LoadedImage(bitmap));}}return null;}@Overridepublic void onProgressUpdate(LoadedImage... value) {addImage(value);}}}

4、上面还涉及一个就是LIstView的适配器,这里是继承BaseAdapter。

JieVideoListViewAdapter.java

package com.zhangjie.graduation.videopalyer.component;import java.util.ArrayList;import java.util.List;import com.zhangjie.graduation.videopalyer.R;import com.zhangjie.graduation.videopalyer.videofile.Video;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;public class JieVideoListViewAdapter extends BaseAdapter{List<Video> listVideos;int local_postion = 0;boolean imageChage = false;private LayoutInflater mLayoutInflater;private ArrayList<LoadedImage> photos = new ArrayList<LoadedImage>();public JieVideoListViewAdapter(Context context, List<Video> listVideos){mLayoutInflater = LayoutInflater.from(context);this.listVideos = listVideos;}@Overridepublic int getCount() {return photos.size();}public void addPhoto(LoadedImage image){photos.add(image);}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {holder = new ViewHolder();convertView = mLayoutInflater.inflate(R.layout.video_list_view, null);holder.img = (ImageView)convertView.findViewById(R.id.video_img);holder.title = (TextView)convertView.findViewById(R.id.video_title);holder.time = (TextView)convertView.findViewById(R.id.video_time);convertView.setTag(holder);}else {holder = (ViewHolder)convertView.getTag();}holder.title.setText(listVideos.get(position).getTitle());//mslong min = listVideos.get(position).getDuration() /1000 / 60;long sec = listVideos.get(position).getDuration() /1000 % 60;holder.time.setText(min+" : "+sec);holder.img.setImageBitmap(photos.get(position).getBitmap());return convertView;}public final class ViewHolder{public ImageView img;public TextView title;public TextView time;}}


5、还有一个在JieVideo类中使用了一个LoadedImage的类,它的代码如下:

package com.zhangjie.graduation.videopalyer.component;import android.graphics.Bitmap;public class LoadedImage {Bitmap mBitmap;public LoadedImage(Bitmap bitmap) {mBitmap = bitmap;}public Bitmap getBitmap() {return mBitmap;}}


那就看看最终的实现效果吧:



更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. android实现软键盘弹出,editText随键盘上移,背景不动
  3. Android菜鸟的成长笔记(5)——Android系统源代码你下载了吗?
  4. Android的Adapter用法总结
  5. 关于GridView宽高的问题(转载rain的文章)
  6. Android(安卓)布局简要范例
  7. Android中的短信
  8. Android(安卓)组件系列-----Activity初步
  9. android 的布局单位 dip dp sp px总结

随机推荐

  1. Android的权限管理浅析
  2. Android(安卓)Studio创建Android项目生成
  3. Android(安卓)sp,wp,RefBase浅析
  4. 如何看待 Kotlin 成为 Android(安卓)官方
  5. 自动搜索私密信息与彻底删除APP--(一)清
  6. Flutter 学习之打包 - 纯Flutter项目生成
  7. Android学习——uses-sdk标签详解
  8. 如何用mysqldump进行全量和时间点备份
  9. mysql优化之like和=性能详析
  10. 详解MySQL 重做日志(redo log)与回滚日志(un