开个新坑
从今天开始学音视频相关知识啦
学习资料比较简单 是这个Android音视频开发学习思路, 感谢大佬w
以下是正题
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不阻塞主线程.