Android音视频学习(一)

栏目: IOS · Android · 发布时间: 6年前

内容简介:三种方式绘制:因为Android权限机制, targetSdkVersion大于等于23(6.0)的应用, 在权限方面需要注意动态获取权限, 我这里做的比较简单, 在onCreate方法里申请 实际使用中不要像我这里直接使用魔法值做requestCode...AndroidManifest.xml

三种方式绘制:

  • 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不阻塞主线程.


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深入理解计算机系统(英文版·第2版)

深入理解计算机系统(英文版·第2版)

[美] Randal E. Bryant、[美] David R. O'Hallaron / 机械工业出版社 / 2011-1 / 128.00元

本书是一本将计算机软件和硬件理论结合讲述的经典教程,内容覆盖计算机导论、体系结构和处理器设计等多门课程。本书的最大优点是为程序员描述计算机系统的实现细节,通过描述程序是如何映射到系统上,以及程序是如何执行的,使读者更好地理解程序的行为为什么是这样的,以及造成效率低下的原因。 相对于第1版,本版主要是反映了过去十年间硬件技术和编译器的变化,具体更新如下: 1. 对系统的介绍(特别是实际使......一起来看看 《深入理解计算机系统(英文版·第2版)》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具