• UI线程和bitmap


    Bitmap

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    Bitmap bitmap = Bitmap.createBitmap(this.getWidth(), this.getHeight(),Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    this.draw(canvas);
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    压缩JPEG格式的图片会比压缩PNG格式的图片快很多

    有时当图片太大导致奔溃,可以尝试将图片移动到mipmap目录下,奔溃问题就可以解决

    组件移动卡顿

    解决方法1:
    使用硬件加速

    android:hardwareAccelerated="true"
    
    • 1

    解决方法2:
    可以在1的基础上解决

    在ondraw时候尽量不要处理太多的事情,比如画圆什么的,移动的尽量是一个固定的图片,比如移动bitmap

    解决方法3:
    移动的时候不要刷新整个屏幕,而是只刷新移动的区域
    ** 创建透明bitmap **

    //不能使用RGB_565,因为RGB_565没有透明度属性
            source = Bitmap.createBitmap((int) radius * 2+20, (int) radius * 2+20, Bitmap.Config.ARGB_8888);
            target = Bitmap.createBitmap((int) radius * 2+20, (int) radius * 2+20, Bitmap.Config.ARGB_8888); 
    
    • 1
    • 2
    • 3

    以下代码可以进程裁剪操作

     paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
    
    • 1

    生成的bitmap可能会产生密度大小的不同,所以需要进行调整密度

    //重点:这里需要将bitmap的密度重新设置,否则会导致bitmap的尺寸改变
            transparentCircle.setDensity(dm.densityDpi);
    
    • 1
    • 2

    Ui操作

    设置textColor的选中颜色,需要在selector中设置颜色

    <item name="android:textColor">@drawable/templator_type_text_selectoritem>
    
    • 1

    Android UI线程

    Android UI线程(主线程)有几个特点:

    只能在 UI 线程操作 UI 视图,不能在子线程中操作。
    不能在 UI 线程中进行耗时操作,否则会阻塞 UI 线程,引起 ANR、卡顿等问题。

    1.可以使用Handler更新UI

    Handler mHandler = newHandler(){
        @Override
        publicvoid handleMessage(Message msg){
            if(msg.what == 1){
                textView.setText("Task Done!!");
            }
        }
    };
    mRunnable = new Runnable() {
        @Override
        publicvoid run() {
            SystemClock.sleep(1000);    // 耗时处理
            mHandler.sendEmptyMessage(1);  
        }
    };
    private void startTask(){
        new Thread(mRunnable).start();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    2.AsyncTask
    AsyncTask 的实例必须在 UI Thread 中创建。
    只能在 UI 线程中调用 AsyncTask 的 execute 方法。
    AsyncTask 被重写的四个方法是系统自动调用的,不应手动调用。
    每个 AsyncTask 只能被执行一次,多次执行会引发异常。
    AsyncTask 的四个方法,只有 doInBackground 方法是运行在其他线程中,其他三个方法都运行在 UI 线程中,也就说其他三个方法都可以进行 UI 的更新操作

    ** Activity的ui线程 **

    activity.runOnUiThread(new Runnable() {
                        public void run() {
                            onPostExecute();
                        }
                    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    使用vue-cli创建Vue工程化项目及单文件组件的创建和调用
    经典算法之顺序查找法
    PgSQL-执行器机制-Unique算子
    【Qt】- 信号和槽函数
    JAVA-JDBC 原理及使用
    C语言基本语法入门练习题
    Windows MFC 工程应用开发与框架原理完全剖析视频教程(中)之下部
    PMP项目管理考试的知识点概述
    申请400开头电话的步骤及注意事项
    数字图像处理笔记
  • 原文地址:https://blog.csdn.net/weixin_46362658/article/details/133710873