Android音視訊學習(一)
三種方式繪製:
- ImageView
- SurfaceView
- 自定義View
申請許可權
因為Android許可權機制, targetSdkVersion大於等於23(6.0)的應用, 在許可權方面需要注意動態獲取許可權, 我這裡做的比較簡單, 在onCreate方法裡申請 實際使用中不要像我這裡直接使用魔法值做requestCode...
AndroidManifest.xml
<!--從SDCard讀取資料許可權 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 複製程式碼
MainActivity:onCreate()
@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()
@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()
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不阻塞主執行緒.