为了账号安全,请及时绑定邮箱和手机立即绑定

SurfaceView

标签:
Android

一、SurfaceView的用法:

        1、在布局文件中设计相关布局;

  1. <?xml version="1.0" encoding="utf-8"?>

  2. <RelativeLayout

  3.    xmlns:android="http://schemas.android.com/apk/res/android"

  4.    xmlns:tools="http://schemas.android.com/tools"

  5.    android:layout_width="match_parent"

  6.    android:layout_height="match_parent"

  7.    android:paddingBottom="@dimen/activity_vertical_margin"

  8.    android:paddingLeft="@dimen/activity_horizontal_margin"

  9.    android:paddingRight="@dimen/activity_horizontal_margin"

  10.    android:paddingTop="@dimen/activity_vertical_margin"

  11.    tools:context="com.qf.day_01.Main2Activity">


  12.    <SurfaceView

  13.        android:layout_width="match_parent"

  14.        android:layout_height="200dp"

  15.        android:id="@+id/sv"/>


  16. </RelativeLayout>

        2、在Java代码中实现业务代码

  1. import android.media.MediaPlayer;

  2. import android.net.Uri;

  3. import android.os.Bundle;

  4. import android.support.v7.app.AppCompatActivity;

  5. import android.view.SurfaceHolder;

  6. import android.view.SurfaceView;


  7. import java.io.IOException;


  8. public class Main2Activity extends AppCompatActivity implements SurfaceHolder.Callback {


  9.    private SurfaceView mSurfaceView;

  10.    private SurfaceHolder mHolder;

  11.    private MediaPlayer mPlayer;


  12.    @Override

  13.    protected void onCreate(Bundle savedInstanceState) {

  14.        super.onCreate(savedInstanceState);

  15.        setContentView(R.layout.activity_main2);

  16.       //查找相关控件

  17.        mSurfaceView = (SurfaceView) findViewById(R.id.sv);


  18.        mHolder = mSurfaceView.getHolder();//得到SurfaceView控制器


  19.        mHolder.addCallback(Main2Activity.this);//添加回调方法

  20.    }


  21.    private void initMediaPlayer() {

  22.        //新建一个媒体播放器

  23.        mPlayer = new MediaPlayer();


  24.        Uri mUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.mtv);


  25.        try {

  26. //设置媒体资源

  27.            mPlayer.setDataSource(this,mUri);


  28.            mPlayer.setDisplay(mHolder);//设置一个SurfaceView的控制器


  29.            mPlayer.prepareAsync();//开始准备


  30.            mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

  31.                @Override

  32.                public void onPrepared(MediaPlayer mp) {

  33.                    mPlayer.start();//准备好之后开始播放

  34.                }

  35.            });

  36.        } catch (IOException e) {

  37.            e.printStackTrace();

  38.        }


  39.    }


  40.    @Override

  41.    public void surfaceCreated(SurfaceHolder holder) {

  42.        initMediaPlayer();

  43.    }


  44.    @Override

  45.    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {


  46.    }


  47.    @Override

  48.    public void surfaceDestroyed(SurfaceHolder holder) {


  49.    }

  50. }

二、仿腾讯新闻中页面播放视频

        1、在布局文件中设计布局(简化)

  1. <?xml version="1.0" encoding="utf-8"?>

  2. <RelativeLayout

  3.    xmlns:android="http://schemas.android.com/apk/res/android"

  4.    xmlns:tools="http://schemas.android.com/tools"

  5.    android:layout_width="match_parent"

  6.    android:layout_height="match_parent"

  7.    android:paddingBottom="@dimen/activity_vertical_margin"

  8.    android:paddingLeft="@dimen/activity_horizontal_margin"

  9.    android:paddingRight="@dimen/activity_horizontal_margin"

  10.    android:paddingTop="@dimen/activity_vertical_margin"

  11.    tools:context="com.qf.day_01.Main4Activity">


  12.    <ListView

  13.        android:layout_width="match_parent"

  14.        android:layout_height="match_parent"

  15.        android:id="@+id/lv">


  16.    </ListView>


  17. </RelativeLayout>

        2、在Java代码中找到控件并设置适配器

  1. import android.support.v7.app.AppCompatActivity;

  2. import android.os.Bundle;

  3. import android.widget.ListView;


  4. public class Main4Activity extends AppCompatActivity {


  5.    private ListView mListView;


  6.    @Override

  7.    protected void onCreate(Bundle savedInstanceState) {

  8.        super.onCreate(savedInstanceState);

  9.        setContentView(R.layout.activity_main4);

  10.        mListView = (ListView) findViewById(R.id.lv);


  11.        mListView.setAdapter(new MyAdapter(this));

  12.    }

  13. }

        3、设计ListView的item布局

  1. <?xml version="1.0" encoding="utf-8"?>

  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

  3.              android:layout_width="match_parent"

  4.              android:layout_height="200dp">

  5.    <SurfaceView

  6.        android:layout_width="match_parent"

  7.        android:layout_height="match_parent"

  8.        android:id="@+id/sv_player"/>

  9.    <ImageView

  10.        android:layout_width="match_parent"

  11.        android:layout_height="match_parent"

  12.        android:background="#ccc"

  13.        android:id="@+id/img"

  14.        android:class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="@android:drawable/ic_media_play"/>


  15. </RelativeLayout>

        4、自定义ListView的适配器

  1. import android.content.Context;

  2. import android.media.MediaPlayer;

  3. import android.net.Uri;

  4. import android.view.LayoutInflater;

  5. import android.view.SurfaceView;

  6. import android.view.View;

  7. import android.view.ViewGroup;

  8. import android.widget.BaseAdapter;

  9. import android.widget.ImageView;


  10. import java.io.IOException;


  11. /**

  12. * 只需要一个MediaPlayer就可以了,因为只有一个视频在播放

  13. */

  14. public class MyAdapter extends BaseAdapter implements MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener {

  15.    private final MediaPlayer mPlayer;

  16.    private Context mContext;


  17.    //当前应该播放视频的位置

  18.    private int currentPosition = -1;


  19.    public MyAdapter(Context context) {

  20.        mContext = context;

  21.        mPlayer = new MediaPlayer();

  22.        //设置监听,必须的监听。

  23.        mPlayer.setOnPreparedListener(this);

  24.        //设置监听。当视频播放完成时候的监听。

  25.        mPlayer.setOnCompletionListener(this);

  26.    }


  27.    @Override

  28.    public int getCount() {

  29.        return 10;

  30.    }


  31.    @Override

  32.    public Object getItem(int position) {

  33.        return null;

  34.    }


  35.    @Override

  36.    public long getItemId(int position) {

  37.        return 0;

  38.    }



  39.    /**

  40.     * 因为getView方法,在页面滑动的时候(页面改变)都会调用,

  41.     * 所以,判断当前是否是应该播放视频的位置。

  42.     * 如果不是,停止播放。

  43.     * 如果是,播放。

  44.     * @param position

  45.     * @param convertView

  46.     * @param parent

  47.     * @return

  48.     */

  49.    @Override

  50.    public View getView(int position, View convertView, ViewGroup parent) {

  51.        ViewHolder mViewHolder=null;

  52.        if (convertView == null) {

  53.            convertView = LayoutInflater.from(mContext).inflate(R.layout.item, parent, false);

  54.            mViewHolder = new ViewHolder();

  55.            mViewHolder.sv = (SurfaceView) convertView.findViewById(R.id.sv_player);

  56.            mViewHolder.img = (ImageView) convertView.findViewById(R.id.img);

  57.            //在这个里面设置ImageView的点击监听。

  58.            mViewHolder.img.setOnClickListener(new View.OnClickListener() {

  59.                @Override

  60.                public void onClick(View v) {

  61.                    //获取到tag,就是当前的位置

  62.                    int position = (int) v.getTag();

  63.                    //赋值给成员变量

  64.                    currentPosition = position;

  65.                    //通知适配器更新

  66.                    notifyDataSetChanged();

  67.                }

  68.            });

  69.            convertView.setTag(mViewHolder);

  70.        } else {

  71.            mViewHolder = (ViewHolder) convertView.getTag();


  72.        }


  73.        Object mTag = mViewHolder.sv.getTag();

  74.        if (mTag != null) {

  75.            //如果有数据

  76.            int oldPosition= (int) mTag;

  77.            //如果SurfaceView的位置和当前播放的位置不一样

  78.            if (oldPosition==currentPosition && oldPosition!=position) {

  79.                if (mPlayer.isPlaying()) {

  80.                    //如果正在播放,而且位置又和应该播放的位置不一样。就停止

  81.                    mPlayer.stop();

  82.                    currentPosition = -1;

  83.                }

  84.            }

  85.        }

  86.        //设置Tag

  87.        mViewHolder.sv.setTag(position);

  88.        mViewHolder.img.setTag(position);


  89.        //判断当前创建视图的位置,是不是应该播放视频的位置

  90.        if (currentPosition == position) {

  91.            //如果是

  92.            mViewHolder.img.setVisibility(View.INVISIBLE);

  93.            mViewHolder.sv.setVisibility(View.VISIBLE);

  94.            Uri mParse = Uri.parse("android.resource://" + mContext.getPackageName() + "/" + R.raw.mtv);

  95.            //重置

  96.            mPlayer.reset();

  97.            try {

  98.                //设置数据源

  99.                mPlayer.setDataSource(mContext, mParse);

  100.                //给MediaPlayer设置一个SurfaceHolder

  101.                mPlayer.setDisplay(mViewHolder.sv.getHolder());

  102.                //开始准备

  103.                mPlayer.prepareAsync();

  104.            } catch (IOException e) {

  105.                e.printStackTrace();

  106.            }

  107.        } else {

  108.            mViewHolder.img.setVisibility(View.VISIBLE);

  109.            mViewHolder.sv.setVisibility(View.INVISIBLE);

  110.        }

  111.        return convertView;

  112.    }


  113.    @Override

  114.    public void onPrepared(MediaPlayer mp) {

  115.        //当准备好之后

  116.        mp.start();

  117.    }


  118.    @Override

  119.    public void onCompletion(MediaPlayer mp) {

  120.        //只需要对currentPosition设置为-1就可以了

  121.        currentPosition = -1;

  122.    }


  123.    private static class ViewHolder{

  124.        SurfaceView sv;

  125.        ImageView img;

  126.    }

  127. }

原文链接:http://www.apkbus.com/blog-815579-61899.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消