Android 与4.0.3相比,4.4.4上的应用程序UI操作(设置alpha、设置边距等)非常慢

Android 与4.0.3相比,4.4.4上的应用程序UI操作(设置alpha、设置边距等)非常慢,android,Android,我有一个seekbar可以改变ImageView的alpha。这在使用安卓4.0.3的旧HTC Desire 200上运行非常顺利。我试着在摩托罗拉Moto G 2014上运行相同的代码,它有android 4.4.4。摩托罗拉手机的功率是HTC的3倍,但当我使用seekbar时,应用程序会结巴 问题不在于这款手机,在安图图的基准测试中,摩托罗拉手机得了18000分,而HTC拿到6000分 以下是seekbar更改事件: int counter = 0; private void

我有一个seekbar可以改变ImageView的alpha。这在使用安卓4.0.3的旧HTC Desire 200上运行非常顺利。我试着在摩托罗拉Moto G 2014上运行相同的代码,它有android 4.4.4。摩托罗拉手机的功率是HTC的3倍,但当我使用seekbar时,应用程序会结巴

问题不在于这款手机,在安图图的基准测试中,摩托罗拉手机得了18000分,而HTC拿到6000分

以下是seekbar更改事件:

    int counter = 0;
    private void mainSeekBarProgreessChanges(SeekBar seekBar, int progress) {
        float a = progress / 100f;
        imgRight.setAlpha(a);

        ++counter;
        txtMsg.setText(Integer.toString(counter));
    }
口吃只出现在大图片(1280x720或更大)中。小图片中没有口吃

当我用seekbar设置视图的边距时,也会出现口吃

以下是应用程序的清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.testprog1"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

众所周知,存在与
setAlpha()
相关的性能问题。例如,见:

  • ,罗曼·努里克的G+邮政
  • (大约29:50),切特·哈斯和罗曼·盖伊的谷歌I/O 2013演讲
由于它是一个
ImageView
小部件,您是否尝试过使用(API级别16+)来代替它

在Nexus 5(Android 5.0)中测试您的示例,我得到:

  • setAlpha()
    --~45ms
  • setImageAlpha()
    --~5ms

但无论哪种方式都不会出现明显的口吃(而且移动SeekBar是完全平滑的)。

我的用例是淡出视图的背景。我保留了对视图背景drawable的引用,并使用其
drawable.setAlpha()
方法


与使用
View.setAlpha(0-1)
ImageView.setImageAlpha(0-255)
相比,这在我的参考手机(Galaxy S3)上的速度非常快。这两种手机的速度都非常慢,而且
ImageView.setImageAlpha(0-255)
似乎没有任何效果。

只想告诉你这个问题的答案:

ViewCompat.setLayerType(view, LAYER_TYPE_HARDWARE, null)
参考:


所有积分均属于Nikola Despotoski

状态,即出于性能原因,在使用
setAlpha
时,应覆盖
hasOverlappingRendering
以返回
false
。可能值得一试。@Stefan:问题是我有重叠渲染:有两个图像彼此重叠,我用seekbar更改了顶部图像的alpha。当我用seekbar设置视图的边距时,也会出现口吃。因此,问题不仅仅与setAlpha有关,它是一个更为全局性的问题。@Stefan:我覆盖了hasOverlappingRendering属性,但没有任何性能改进您应该启用“设置-->开发人员选项-->启用GPU评测”。。。然后发布结果的屏幕截图。我尝试使用setImageAlpha(),但没有区别,延迟仍然存在。我不认为设置alpha有什么问题,问题在链中更高的位置,因为每个UI操作都是滞后的,不仅仅是设置alpha:当我使用seekbar设置边距时有滞后,当我在TouchImageView中拖动缩放图像时有滞后。所有这些都能在速度慢得多的手机上完美运行。@kovacslorand这很奇怪,我用自己的结果更新了帖子(当然是不同的设备和Android版本,但差别是极端的)。您的布局中没有其他内容吗?背景?这两幅图像的尺寸是多少?在我禁用硬件加速后,我在for循环测试中得到了更好的结果,大约400。如果我在没有调试的情况下运行应用程序,那么我在两部手机上得到的值是相同的(大约15),但是在速度较慢的手机上没有口吃,而在速度较快的手机上仍然有口吃。所以我认为for循环测试与我的问题不再相关。图像为1280x720。对于较小的图像,没有口吃,只有较大的图像。可能是因为摩托罗拉手机的屏幕分辨率更高,所以需要转换的像素更多?事实上,为了获得更好的性能,你需要禁用硬件加速,这意味着你的代码肯定有问题。。。您应该启用GPU评测并发布结果的屏幕截图(这将帮助我们了解造成延迟的原因)。我还强烈建议使用Systrace,因为该工具是详细了解引擎盖下发生的事情的唯一真正方法。我看到了相同的结果,setImageAlpha速度更快。另外,+1表示使用短语“像球一样慢”
FrameLayout.LayoutParams layoutParamLeft = (LayoutParams) layoutLeft.getLayoutParams();
layoutParamLeft.setMargins(layoutParamLeft.leftMargin, layoutParamLeft.topMargin, seekBar.getMax() - progress, layoutParamLeft.bottomMargin);
layoutLeft.setLayoutParams(layoutParamLeft);
layoutLeft.invalidate();

FrameLayout.LayoutParams layoutParamRight = (LayoutParams) layoutRight.getLayoutParams();
layoutParamRight.setMargins(progress, layoutParamRight.topMargin, layoutParamRight.rightMargin, layoutParamRight.bottomMargin);
layoutRight.setLayoutParams(layoutParamRight);
layoutRight.invalidate();
ViewCompat.setLayerType(view, LAYER_TYPE_HARDWARE, null)