美文网首页
Android 使用三种方式绘制一张图片

Android 使用三种方式绘制一张图片

作者: NineThm | 来源:发表于2018-07-06 15:07 被阅读0次

    已经很久没写博客了,最近的flutter也挺火的,趁着最近工作的时候把项目都完结掉了以后顺便看着学了点,也看了下NDK的东西,尝试了一些简单的NDK 的入门,然后倍感无聊,因为NDK的资料在网上实在是少之又少,甚至是有点想放弃打算随缘了。。。。emmm感觉这辈子可能都很难接触到NDK的东西,突然,一个朋友给我推荐了下NDK的学习路线,开始转入音频学习。。。

    然后给我发了一个学习任务单,也就是这位大神的 :http://blog.51cto.com/ticktick/1956269?source=dra

    那么废话不多说,现在就开始进入正题

    在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 View

    1、ImageView

    这个。。。我想每个安卓开发都是必须要会的东西,很简单啊

    imageView.setBackgroundResource(R.drawable.xxx);
    

    2、SurfaceView

    这个控件,我想在平时正常的开发中出现的频率还是挺高的,比如,大家都在用的zxing, 像我开发让我接入的xx云直播的时候也用到了这个。

    那么,SurfaceView是什么呢?根据SDK的文档说明,他其实就是一个在窗口挖一个洞,他就显示在这个洞里,其他的View显示在窗口上,所以也可以显示在SurfaceView上。SurfaceView在绘制方面有着极其强大的功能,最重要的是它支持OpenGL ES库,2D和3D的效果都可以实现。其次,view的刷新都是在主线程上,而Surface的刷新可以由任何一个线程控制刷新,我们也可以控制他的生命周期,是一些高频率刷新视图的app提供了一个优秀的容器。

    SurfaceView它的绘制原理是绘制前先锁定画布(获取画布),然后等都绘制结束以后在对画布进行解锁 ,最后在把画布内容显示到屏幕上。 我们需要实现他的SurfaceHolder.Callback方法,也就是对他的生命周期进行监听

     //获取SurfaceView的视图控制器
            SurfaceHolder holder = surfaceView.getHolder();
            holder.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.decodeResource(getResources(), R.drawable.xxx);
    
                    /*当surfaceHolder开始调用lockCanvas方法后开启一个同步锁
                     *保护在绘制中原来的内容不被改变
                     *当调用了unlockCanvasAndPost方法之后,才会通知surface开始绘制要改变的区域
                     */
                    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) {
    
                }
            });
    

    3、自定义View

    这个,其实感觉也不难。

        Paint paint = new Paint();
        Bitmap bitmap;
    
        private void init(){
            paint.setAntiAlias(true);
            bitmap = BitmapFactory.decodeResource(getResources() , R.drawable.xxx);
        }
    
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            
            canvas.drawBitmap(bitmap , 0 , 0 , paint);
        }
    

    emmm,第一个任务还是很简单的,今天周五,皮个双休,下周一开始准备下第二个任务

    感谢:
    [1]https://adajqd.github.io/2018/03/20/2018-3-20-%E4%BD%BF%E7%94%A8%E4%B8%89%E7%A7%8D%E6%96%B9%E5%BC%8F%E7%BB%98%E5%88%B6%E4%B8%80%E5%BC%A0%E5%9B%BE%E7%89%87/

    相关文章

      网友评论

          本文标题:Android 使用三种方式绘制一张图片

          本文链接:https://www.haomeiwen.com/subject/jeovuftx.html