音视频学习:在Android 平台绘制一张图片

Android  音视频  2021年3月24日 pm10:22发布4年前 (2021)更新 91es.com站长
97 0 0

前言

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

正文

下面分别使用ImageView、SurfaceView和自定义View,其中SurfaceView部分有参考其他网友(具体如下链接)。

ImageView

这个比较简单,现成的。

    findViewById(R.id.show_image_iv_one).setBackground(getResources().getDrawable(R.mipmap.one_test_image));

SurfaceView

  1. SurfaceView这个类实现了SurfaceHolder.Callback接口 接口中主要有三个回调函数SurfaceChanged,Surfacecreated,Surfaceondestoryed分别对应Surface更改,创建,销毁。
  2. 对Surface对象的操作是通过SurfaceHolder来进行的。所以,在你的SurfaceView类初始化的时候,你需要调用getHolder()。来获得SurfaceHolder对象,然后用addCallback()加上回调接口(因为你的类实现了相应的接口,所以此处传入this即可)。
  3. 在你的SurfaceView类中应该建立一个线程类,处理绘制操作。为此,要向这个线程类传递上面获得的SurfaceHolder对象。
  4. 绘制:在线程类的run()方法中进行绘制操作,通过lockCanvas()方法获得Canvas对象,然后就可以用这个对象进行绘制,绘制完成后调用unlockCanvasAndPost(),传入Canvas对象,这时Surface将会按Canvas进行绘制。

注意:每次利用SurfaceHolder获得画布时,前一次的内容将会保留。

    class SurfaceViewThread extends Thread {

        private SurfaceHolder mSurfaceHolder = null;

        SurfaceViewThread(SurfaceHolder surfaceHolder) {
            mSurfaceHolder = surfaceHolder;
        }

        @Override
        public void run() {
            super.run();
            Log.d(TAG, "run  surfaceHolder : " + mSurfaceHolder);
            if (null != mSurfaceHolder) {
                Canvas canvas = mSurfaceHolder.lockCanvas();
                Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.one_test_image);
                canvas.drawBitmap(bitmap, 0, 0, null);
                mSurfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
    }

    SurfaceView surfaceView = findViewById(R.id.show_image_sv_two);

    SurfaceViewThread surfaceViewThread = new SurfaceViewThread(surfaceView.getHolder());

    surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            Log.d(TAG, "surfaceCreated: ");
            surfaceViewThread.start();
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            Log.d(TAG, "surfaceChanged: ");
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            Log.d(TAG, "surfaceDestroyed: ");
            try {
                surfaceViewThread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });

自定义View

public class MyImageView extends View {

    private Bitmap mBitmap = null;

    public MyImageView(Context context) {
        this(context, null);
    }

    public MyImageView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MyImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initUI();
    }

    /**
     * init ui
     */
    private void initUI() {
        mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.one_test_image);
        return;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawBitmap(mBitmap, 0, 0, null);
    }

    /**
     * release
     */
    public void release() {
        if (null != mBitmap && !mBitmap.isRecycled()) {
            mBitmap.isRecycled();
        }
        return;
    }

参考文章

  1. Android 音视频开发入门指南
  2. 音视频学习1-使用ImageView,SurfaceView,自定义 View,绘制图片

 历史上的今天

  1. 2023: [摘]WindowManger层级记录(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

许知远:优雅的爱情到哪里去了

"将爱情进行到底",这句畅快淋漓的口号暴露了我们的致命伤口--我们正在失去爱情。不管我们的唱片工业产生了多少"为爱伤心欲绝的男人与女人",也不管架上的流行书籍上提供了多少爱与性的技巧,我们得承认,我们的爱情正在失去它应有的光彩,它正变得平庸化与技术化。爱情变成了我们忙碌生活的一种放松方式,变成了一种...

沈从文 : 独处

在我一个自传里,我曾经提到过水给我种种的印象。檐溜、小小的河流、汪洋万顷的大海,莫不对于我有过极大的帮助。我学会用小小脑子去思索一切,全亏得是水。我对于宇宙认识得深一点,也亏得是水。“孤独一点,在你缺少一切的时节,你就会发现,原来还有个你自己。”这是一句真话。我有我自己的生活与理想,可以说是...

去除Notification提示音

前言Android开机时,notification通知会有提示音。这个是之前写的,重新摘抄于此。正文修改地方\androidp\frameworks\base\services\core\java\com\android\server\notification\Notificatio...

张大千:做和尚的一百天

我的未婚妻,原本就是我的表姐,比我大三个月,我们的感情极好,可惜她过早死去。她叫谢舜华,尧舜的舜,中华的华……我由日本回来,本想回内江祭吊尽心,可是正逢张勋在闹复辟,兵荒马乱,我回不了四川,家兄又命我回日本,那年我二十岁。我二十一岁(一九二零年)由日本回来,当时我确实有过念头,今生不愿结婚了。我家...

Ubuntu16安装openjdk-7

Ubuntu16.04 安装openjdk-7-jdksudo apt-get install openjdk-7-jre 或者sudo apt-get install openjdk-7-jdkUbuntu16.04的安装源已经默认没有openjdk7了,所以要自己手动添加仓库,如下:...

从维熙:夜空中的木拐

非常凑巧,游览了好莱坞和迪斯尼,适逢圣诞节的黄昏。又从洛杉矶开车一路疾行,穿越加州南部地区,连夜向亚历桑那州的首府菲尼克斯飞驰。平日喧闹的高速公路,在这圣诞之夜出奇地安静,隔着车窗外望,四野一片迷茫。此时,公路两旁的灯光消失了往日的鲜亮,就像与人一路同行的月光一样,把地球上这个头号富国,变成了难...