Android音視頻學習(一)

開個新坑

從今天開始學音視頻相關知識啦html

學習資料比較簡單 是這個Android音視頻開發學習思路, 感謝大佬wjava

如下是正題android


Android 音視頻開發(一) : 經過三種方式繪製圖片

三種方式繪製:canvas

  • ImageView
  • SurfaceView
  • 自定義View

申請權限

由於Android權限機制, targetSdkVersion大於等於23(6.0)的應用, 在權限方面須要注意動態獲取權限, 我這裏作的比較簡單, 在onCreate方法裏申請 實際使用中不要像我這裏直接使用魔法值作requestCode...ide

AndroidManifest.xml學習

<!--  從SDCard讀取數據權限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
複製代碼

MainActivity:onCreate()ui

@Override
  protected void onCreate(Bundle savedInstanceState) {
    ...

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
      ActivityCompat.requestPermissions(this,
          new String[] { Manifest.permission.READ_EXTERNAL_STORAGE }, 1);
    } else {
      showPicture();
    }
  }
複製代碼

MainActivity:onRequestPermissionResult()this

@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
      case 1: {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
          showPicture();
        }
        return;
      }
      default:
    }
  }
複製代碼

ImageView

MainActivity:showPicture()spa

private void showPicture() {
    Bitmap bitmap = BitmapFactory.decodeFile(
        Environment.getExternalStorageDirectory().getPath() + File.separator + "11.jpg");
    mImageView.setImageBitmap(bitmap);
  }
複製代碼

比較簡單, 經過BitmapFactory.decodeFile方法獲取一張在內置存儲卡根目錄中的圖片線程

SurfaceView

MainActivity:showPicture()

private void showPicture() {
    mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
      @Override public void surfaceCreated(SurfaceHolder holder) {
        if (holder == null) {
          return;
        }

        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);

        Bitmap bitmap = BitmapFactory.decodeFile(
            Environment.getExternalStorageDirectory().getPath() + File.separator + "11.jpg");
        Canvas canvas = holder.lockCanvas();
        canvas.drawBitmap(bitmap, 0, 0, paint);
        holder.unlockCanvasAndPost(canvas);
      }

      @Override
      public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

      }

      @Override public void surfaceDestroyed(SurfaceHolder holder) {

      }
    });
  }
複製代碼

Surface也是常常用到的繪製方法, 優勢比較多, 獨立線程繪製不影響主線程, 雙緩衝機制都是. 這裏是在初始化的回調裏繪製準備好的Bitmap. 注意繪製前要lockCanvas, 繪製完要unlockAndPost

自定義View

MyView

public class MyView extends View {

  Paint mPaint;
  Bitmap mBitmap;

  public MyView(Context context) {
    super(context);
    init();
  }

  public MyView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    init();
  }

  private void init() {
    mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    mPaint.setStyle(Paint.Style.STROKE);
    mBitmap = BitmapFactory.decodeFile(
        Environment.getExternalStorageDirectory().getPath() + File.separator + "11.jpg");
  }

  @Override protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    if (mBitmap != null) {
      canvas.drawBitmap(mBitmap, 0, 0, mPaint);
    }
  }
}
複製代碼

自定義View也是常常用到的, 具體想了解自定義View的我推薦HenCoder系列的教程

總結

繪製的三種方式, 很基礎, 各有優點, ImageView簡單好學, SurfaceView不阻塞主線程.

相關文章
相關標籤/搜索