/app/src/main/java/com/xiuyukeji/pictureplayerview/sample/step1/PicturePlayerView1.java

https://github.com/a483210/PicturePlayerView · Java · 124 lines · 93 code · 22 blank · 9 comment · 6 complexity · 8f9665e20945feff077a26594b42d186 MD5 · raw file

  1. package com.xiuyukeji.pictureplayerview.sample.step1;
  2. import android.content.Context;
  3. import android.graphics.Bitmap;
  4. import android.graphics.BitmapFactory;
  5. import android.graphics.Canvas;
  6. import android.graphics.Color;
  7. import android.graphics.Paint;
  8. import android.graphics.PorterDuff;
  9. import android.graphics.Rect;
  10. import android.graphics.SurfaceTexture;
  11. import android.os.SystemClock;
  12. import android.util.AttributeSet;
  13. import com.xiuyukeji.pictureplayerview.sample.BasePicturePlayerView;
  14. import java.io.IOException;
  15. /**
  16. * 步骤1实现
  17. *
  18. * @author Created by jz on 2017/3/29 17:49
  19. */
  20. public class PicturePlayerView1 extends BasePicturePlayerView {
  21. private Paint mPaint;//画笔
  22. private Rect mSrcRect;
  23. private Rect mDstRect;
  24. private int mPlayFrame;//当前播放到那一帧,总帧数相关
  25. private String[] mPaths;//图片绝对地址集合
  26. private int mFrameCount;//总帧数
  27. private long mDelayTime;//播放帧间隔
  28. private PlayThread mPlayThread;
  29. //... 省略构造方法
  30. public PicturePlayerView1(Context context) {
  31. this(context, null);
  32. }
  33. public PicturePlayerView1(Context context, AttributeSet attrs) {
  34. this(context, attrs, 0);
  35. }
  36. public PicturePlayerView1(Context context, AttributeSet attrs, int defStyle) {
  37. super(context, attrs, defStyle);
  38. init();
  39. }
  40. private void init() {
  41. setOpaque(false);//设置背景透明,记住这里是[是否不透明]
  42. setSurfaceTextureListener(this);//设置监听
  43. mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);//创建画笔
  44. mSrcRect = new Rect();
  45. mDstRect = new Rect();
  46. }
  47. //... 省略SurfaceTextureListener的方法
  48. @Override
  49. public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
  50. mPlayFrame = mFrameCount;
  51. try {
  52. if (mPlayThread != null) {
  53. mPlayThread.join();
  54. }
  55. } catch (InterruptedException e) {
  56. e.printStackTrace();
  57. }
  58. return false;
  59. }
  60. //开始播放
  61. @Override
  62. public void start(String[] paths, long duration) {
  63. this.mPaths = paths;
  64. this.mFrameCount = paths.length;
  65. this.mDelayTime = duration / mFrameCount;
  66. //开启线程
  67. mPlayThread = new PlayThread();
  68. mPlayThread.start();
  69. }
  70. private class PlayThread extends Thread {
  71. @Override
  72. public void run() {
  73. try {
  74. while (mPlayFrame < mFrameCount) {//如果还没有播放完所有帧
  75. Bitmap bitmap = readBitmap(mPaths[mPlayFrame]);
  76. drawBitmap(bitmap);
  77. recycleBitmap(bitmap);
  78. mPlayFrame++;
  79. SystemClock.sleep(mDelayTime);//暂停间隔时间
  80. }
  81. } catch (Exception e) {
  82. e.printStackTrace();
  83. }
  84. }
  85. }
  86. private Bitmap readBitmap(String path) throws IOException {
  87. return BitmapFactory.decodeStream(getResources().getAssets().open(path));
  88. }
  89. private void drawBitmap(Bitmap bitmap) {
  90. Canvas canvas = lockCanvas();//锁定画布
  91. canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);// 清空画布
  92. mSrcRect.set(0, 0, bitmap.getWidth(), bitmap.getHeight());//这里我将2个rect抽离出去,防止重复创建
  93. mDstRect.set(0, 0, getWidth(), bitmap.getHeight() * getWidth() / bitmap.getWidth());
  94. canvas.drawBitmap(bitmap, mSrcRect, mDstRect, mPaint);//将bitmap画到画布上
  95. unlockCanvasAndPost(canvas);//解锁画布同时提交
  96. }
  97. private static void recycleBitmap(Bitmap bitmap) {
  98. if (bitmap != null && !bitmap.isRecycled()) {
  99. bitmap.recycle();
  100. }
  101. }
  102. }