内容简介:三种方式绘制:因为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不阻塞主线程.
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 一文读懂监督学习、无监督学习、半监督学习、强化学习这四种深度学习方式
- 学习:人工智能-机器学习-深度学习概念的区别
- 统计学习,机器学习与深度学习概念的关联与区别
- 混合学习环境下基于学习行为数据的学习预警系统设计与实现
- 学习如何学习
- 深度学习的学习历程
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python编程实战
[美] Mark Summerfield / 爱飞翔 / 机械工业出版社 / 2014-8 / 69.00元
《python编程实战:运用设计模式、并发和程序库创建高质量程序》由python开发者社区知名技术专家mark summerfield亲笔撰写,全球资深python专家doug hellmann作序鼎力推荐,是python领域最有影响力的著作之一。书中通过大量实用的范例代码和三个完整的案例研究,全面而系统地讲解了如何运用设计模式来规划代码结构,如何通过并发与cython等技术提升代码执行速度,以及......一起来看看 《Python编程实战》 这本书的介绍吧!