Surfaceview

 

surfaceview

  17人阅读  评论(0)  收藏  举报

SurfaceView控件:
 * 1.主要用来显示图像数据,直接能从硬件接口里面获取数据: 视屏播放,拍照,二维码扫描或者游戏背景。。。
 * 2.该控件具有双缓冲机制,实现效率高
 * 3.能够在子线程中修改UI
 * 4.SurfaceView控件的绘制内容,是靠内部类SurfaceHolder来进行绘制的

 

 使用步骤:
 * 1.继承surfaceview控件,同时去实现surfaceholder.callback接口
 * 2.得到里面的surfaceholder
 * 3.surfaceholder去实现addcallback(3个回调方法,管surfaceview显示的生命周期)
 * 4.通过surfaceholder拿到画布canvas
 * 5.绘图
 * 6.通过surfaceholder提交绘制内容

 自定义一个矩形

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. 自定义一个类  
  2.  //1.创建MySurfaceView  
  3.     class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback{  
  4.         //拿到surfaceholder内部的holder,这个是控制绘制内容  
  5.         private SurfaceHolder holder;  
  6.         //绘制图像的画笔  
  7.         private Paint paint;  
  8.   
  9.         public MySurfaceView(Context context) {  
  10.             super(context);  
  11.             init();  
  12.         }  
  13.   
  14.         public MySurfaceView(Context context, AttributeSet attrs) {  
  15.             super(context, attrs);  
  16.             init();  
  17.         }  
  18.         private void init() {  
  19.             //2.拿到holder  
  20.             holder=getHolder();  
  21.             //3.  
  22.             holder.addCallback(this);  
  23.             paint=new Paint();  
  24.             paint.setColor(Color.RED);  
  25.         }  
  26.         //控制显示界面的生命周期  
  27.         @Override  
  28.         public void surfaceCreated(SurfaceHolder holder) {  
  29.             //4.holder通过调用方法难道绘图的画布  
  30.             Canvas canvas = holder.lockCanvas();  
  31.             //5.进行内容绘制,开个线程  
  32.             canvas.drawRect(20,20,120,120,paint);  
  33.             //6.绘制完成之后进行提交内容  
  34.             holder.unlockCanvasAndPost(canvas);  
  35.         }  
  36.   
  37.         @Override  
  38.         public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  
  39.   
  40.         }  
  41.   
  42.         @Override  
  43.         public void surfaceDestroyed(SurfaceHolder holder) {  
  44.   
  45.         }  
  46.     }  

自定义一个倒计时

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class MyTwoSurfaceView extends SurfaceView implements SurfaceHolder.Callback {  
  2.    //2.  
  3.    private SurfaceHolder holder;  
  4.    //绘制矩形的设置  
  5.    private Paint paint, txtPaint;  
  6.    //显示文字倒计时  
  7.    private int count = 60;  
  8.    //控制线程  
  9.    private boolean flag=true;  
  10.   
  11.    public MyTwoSurfaceView(Context context, AttributeSet attrs) {  
  12.        super(context, attrs);  
  13.        init();  
  14.    }  
  15.   
  16.    public MyTwoSurfaceView(Context context) {  
  17.        super(context);  
  18.        init();  
  19.    }  
  20.   
  21.    private void init() {  
  22.        holder = getHolder();  
  23.        //3.  
  24.        holder.addCallback(this);  
  25.        paint = new Paint();  
  26.        paint.setColor(Color.YELLOW);  
  27.        //绘制文字的大小和文字宽度  
  28.        txtPaint = new Paint();  
  29.        txtPaint.setStrokeWidth(10);  
  30.        txtPaint.setTextSize(20);  
  31.    }  
  32.   
  33.    @Override  
  34.    public void surfaceCreated(SurfaceHolder holder) {  
  35.        //开启线程执行绘制  
  36.        new MyDrawThread(holder).start();  
  37.        flag=true;  
  38.   
  39.    }  
  40.   
  41.    @Override  
  42.    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  
  43.   
  44.    }  
  45.   
  46.    @Override  
  47.    public void surfaceDestroyed(SurfaceHolder holder) {  
  48.        flag=false;  
  49.   
  50.    }  
  51.   
  52.    //开启一个线程绘制显示的内容  
  53.    //倒计时60-0  
  54.    class MyDrawThread extends Thread {  
  55.        //拿到surfaceview里面的holder  
  56.        SurfaceHolder holder;  
  57.   
  58.        public MyDrawThread(SurfaceHolder holder) {  
  59.            this.holder = holder;  
  60.        }  
  61.   
  62.        @Override  
  63.        public void run() {  
  64.            super.run();  
  65.            Canvas canvas;  
  66.            while (flag) {  
  67.                canvas = holder.lockCanvas();  
  68.                //绘制矩形  
  69.                canvas.drawRect(2020120120, paint);  
  70.                //绘制倒计时文字部分  
  71.                if (count == 0) {  
  72.                    count=60;  
  73.                    canvas.drawText("倒计时开始" + count--, 3060, txtPaint);  
  74.                } else {  
  75.                    canvas.drawText("倒计时" + count--, 3060, txtPaint);  
  76.                }  
  77.                try {  
  78.                    Thread.sleep(1000);  
  79.                } catch (InterruptedException e) {  
  80.                    e.printStackTrace();  
  81.                }  
  82.                    holder.unlockCanvasAndPost(canvas);  
  83.   
  84.            }  
  85.        }  
  86.    }  


制作视频播放(本地视频和有URL类的视频)
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. 布局文件这些都可以直接拿过用  
  2.  <SurfaceView  
  3.         android:id="@+id/surfaceview"  
  4.         android:layout_width="match_parent"  
  5.         android:layout_height="0dp"  
  6.         android:layout_weight="8"  
  7.          />  
  8.     <LinearLayout  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="20dp">  
  11.         <SeekBar  
  12.             android:id="@+id/seekbar"  
  13.             android:layout_width="match_parent"  
  14.             android:layout_height="wrap_content" />  
  15.     </LinearLayout>  
  16.     <LinearLayout  
  17.         android:layout_width="match_parent"  
  18.         android:layout_height="0dp"  
  19.         android:layout_weight="1"  
  20.         android:orientation="horizontal">  
  21.         <Button  
  22.             android:id="@+id/bt_play"  
  23.             android:layout_width="0dp"  
  24.             android:layout_height="match_parent"  
  25.             android:layout_weight="1"  
  26.             android:gravity="center"  
  27.             android:onClick="onclick"  
  28.             android:text="播放"/>  
  29.         <Button  
  30.             android:id="@+id/bt_pouse"  
  31.             android:layout_width="0dp"  
  32.             android:layout_height="match_parent"  
  33.             android:layout_weight="1"  
  34.             android:gravity="center"  
  35.             android:onClick="onclick"  
  36.             android:text="暂停"/>  
  37.         <Button  
  38.             android:id="@+id/bt_stop"  
  39.             android:layout_width="0dp"  
  40.             android:layout_height="match_parent"  
  41.             android:layout_weight="1"  
  42.             android:gravity="center"  
  43.             android:onClick="onclick"  
  44.             android:text="停止"/>  
  45.     </LinearLayout>  
  46.   
  47.     activity里面的代码:  
  48.   
  49.     /** 
  50.  * Surfaceview结合MediaPlayer做视屏播放 
  51.  * mp4.3gp. 
  52.  */  
  53. public class MainActivity extends AppCompatActivity {  
  54.     //视屏播放显示界面  
  55.     private SurfaceView surfaceview;  
  56.     private SurfaceHolder holder;  
  57.     //控制播放进度  
  58.     private SeekBar seekbar;  
  59.     //音频播放器  
  60.     private MediaPlayer mediaPlayer;  
  61.     //计时器对象  
  62.     private Timer timer=new Timer();  
  63.     private TimerTask task;  
  64.     private Handler handler=new Handler(){  
  65.         @Override  
  66.         public void handleMessage(Message msg) {  
  67.             super.handleMessage(msg);  
  68.             if(msg.what==0){  
  69.                 //更新进度条  
  70.                 seekbar.setProgress(mediaPlayer.getCurrentPosition());  
  71.             }  
  72.         }  
  73.     };  
  74.   
  75.     @Override  
  76.     protected void onCreate(Bundle savedInstanceState) {  
  77.         super.onCreate(savedInstanceState);  
  78.         setContentView(R.layout.activity_main);  
  79.         init();  
  80.         setProgressSeekBar();  
  81.     }  
  82.   
  83.     private void setProgressSeekBar() {  
  84.         task=new TimerTask() {  
  85.             @Override  
  86.             public void run() {  
  87.                 //更新操作  
  88.                 handler.sendEmptyMessage(0);  
  89.             }  
  90.         };  
  91.         timer.schedule(task,0,10);  
  92.     }  
  93.   
  94.     private void init() {  
  95.         surfaceview = (SurfaceView) findViewById(R.id.surfaceview);  
  96.         holder=surfaceview.getHolder();  
  97.         holder.addCallback(new SurfaceHolder.Callback() {  
  98.             @Override  
  99.             public void surfaceCreated(SurfaceHolder holder) {  
  100.   
  101.             }  
  102.   
  103.             @Override  
  104.             public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  
  105.   
  106.             }  
  107.   
  108.             @Override  
  109.             public void surfaceDestroyed(SurfaceHolder holder) {  
  110.   
  111.             }  
  112.         });  
  113.         mediaPlayer=new MediaPlayer();  
  114.         seekbar = (SeekBar) findViewById(R.id.seekbar);  
  115.         //拉动seekbar的时候更改播放进度  
  116.         seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {  
  117.             @Override  
  118.             public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {  
  119.   
  120.             }  
  121.   
  122.             @Override  
  123.             public void onStartTrackingTouch(SeekBar seekBar) {  
  124.   
  125.             }  
  126.   
  127.             @Override  
  128.             public void onStopTrackingTouch(SeekBar seekBar) {  
  129.                 //设置播放进度  
  130.                 mediaPlayer.seekTo(seekBar.getProgress());  
  131.             }  
  132.         });  
  133.         //seekbar.setProgress(mediaPlayer.getCurrentPosition());  
  134.     }  
  135.   
  136.     public void onclick(View view) {  
  137.         switch (view.getId()) {  
  138.             case R.id.bt_play:  
  139.                 playMedia();  
  140.                 break;  
  141.             case R.id.bt_pouse:  
  142.                 if(mediaPlayer.isPlaying()){  
  143.                     mediaPlayer.pause();  
  144.                 }else {  
  145.                     mediaPlayer.start();  
  146.                 }  
  147.                 break;  
  148.             case R.id.bt_stop:  
  149.                 mediaPlayer.stop();  
  150.                 break;  
  151.         }  
  152.     }  
  153.   
  154.     //播放视屏  
  155.     private void playMedia() {  
  156.         mediaPlayer.reset();//停止之后在开启播放  
  157.         //设置播放视频的路径  
  158.         String path= Environment.getExternalStorageDirectory()+ File.separator+"movie.mp4";  
  159.         File file=new File(path);  
  160.         if(file.exists()) {  
  161.             try {  
  162.                 //设置视屏播放的路径,可以是一个mp4的视屏网址,mp4,3gp,  
  163.                 mediaPlayer.setDataSource(file.getAbsolutePath());  
  164.                 //设置视屏播放界面holder  
  165.                 mediaPlayer.setDisplay(holder);  
  166.                 //设置视屏准备  
  167.                 mediaPlayer.prepareAsync();  
  168.                 //设置是否准备好的监听  
  169.                 mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {  
  170.                     @Override  
  171.                     public void onPrepared(MediaPlayer mp) {  
  172.                         if(mp.getVideoHeight()>0&&mp.getVideoWidth()>0){  
  173.                             //视屏播放方法  
  174.                             mp.start();  
  175.                             //设置播放进度条最大长度  
  176.                             seekbar.setMax(mp.getDuration());  
  177.                         }  
  178.                     }  
  179.                 });  
  180.             } catch (IOException e) {  
  181.                 e.printStackTrace();  
  182.             }  
  183.         }else{  
  184.             Toast.makeText(this,"null",Toast.LENGTH_SHORT).show();  
  185.         }  
  186.     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值