【问题标题】:Android - Application may be doing to much work on its main threadAndroid - 应用程序可能在其主线程上做了很多工作
【发布时间】:2016-07-07 06:04:53
【问题描述】:

我知道我的主线程中有很多事情要做,但我正在寻找解决方法。

这是我的应用程序的结构:

目前我有我的主要活动,它有 6 个可点击的图像视图(打开新活动),当打开其中一个活动时会出现问题。在这个活动中,我使用了一个带有 3 个选项卡的 SlidingTabLayout。

这就是我想要达到的目标:

我正在用可绘制对象(形状)创建一架钢琴

例如,这是黑键:

<shape
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle">
<stroke
    android:width="1dp"
    android:color="#FF000000" />

    <solid 
      android:color="#FF000000"/>
</shape> 

然后我在布局中调用这个可绘制对象来创建钢琴:

<ImageView
    android:layout_width="8dp"
    android:layout_height="37dp"
    android:layout_marginLeft="40dp"
    android:layout_marginStart="10.5dp"
    android:src="@drawable/key_black" />

我为每个钢琴显示 7 个黑键图像视图和 10 个白键图像视图,每个选项卡有 11 个钢琴。所以每个标签有 187 个 Imageview。

所以我知道这会对我的 CPU 造成严重影响。我正在寻找一种方法来对我的主线程执行此操作?在后台做?要做到这一点而不会遇到滞后?

【问题讨论】:

  • 你能提供一张应该是什么样子的图片并解释你想要达到什么/应该做什么吗?显然您希望用户与钢琴的键进行交互?但是 187 个可交互的项目在一个屏幕上似乎有点多
  • 我只想显示钢琴的,我不希望用户与之交互。
  • 那为什么你需要将键放在单独的图像视图中呢?如何在 .png 中或使用 Android 形状创建整个钢琴,然后将其放在一个 imageView 中?还是应该动画?
  • 每架钢琴显示不同的按键,所以每架钢琴看起来都不同,所以使用钢琴的一个 png 是行不通的。为每架钢琴使用多个 png 会导致同样的问题。

标签: android xml multithreading imageview lag


【解决方案1】:

如上所述,我将为钢琴创建一个基本图像,并根据当前按下的键进行调整。下面的代码展示了大致的思路:从 R.drawable 加载基础图像,使用按键的索引以及图像的大小来创建Paths,绘制路径,返回图像。如果您需要澄清,请告诉我。

public Bitmap getPianoImage(Context context, int[] pressedKeyIndices){
    Bitmap pianoImage = BitmapFactory.decodeResource(context.getResources(), R.drawable.pianoBase);
    Canvas canvas = new Canvas(pianoImage);
    Paint paint = new Paint();
    paint.setColor(Color.RED);
    paint.setStyle(Paint.Style.FILL);

    for(int pressedKeyIndex : pressedKeyIndices){
        Path path = getPathForKeyIndex(pressedKeyIndex, pianoImage.getWidth(), pianoImage.getHeight());
        canvas.drawPath(path, paint);
    }

    return pianoImage;
}

private Path getPathForKeyIndex(int idx, int w, int h){

    Path path = new Path();

    switch(idx){
        case 0:
            path.moveTo(0f*w, 0f*h); // used for first point
            path.lineTo(0f*w, 1f*h);
            path.lineTo(0.1f*w, 1f*h);
            path.lineTo(0.1f*w, 0.5f*h);
            path.lineTo(0.08f*w, 0.5f*h);
            path.lineTo(0.08f*w, 0f*h);
            path.lineTo(0f*w, 0f*h);
            break;
        case 1: ...
    }

    return path;
}

【讨论】:

  • 能否请您澄清一下我应该在我的 xml 中做什么?
  • 您不需要任何 xml 文件。将钢琴的基本图像(只有黑色和白色)放在R.drawable 文件夹(-> R.drawable.pianoBase)中。然后使用上面的代码(需要完成)创建一个Bitmap。位图采用基础图像,并为与您作为函数参数传入的 ne 指标对应的区域着色。
  • 我已将图像放在 R.drawable 中,并且我已将您的代码粘贴到其中,但没有任何反应,看不到图像。我明白您在说什么,但我看不到图像
  • 那么首先需要完成上面的代码。您需要为getPathForKeyIndex(int idx, int w, int h) 函数中的17 个键中的每一个指定一个路径。路径需要跟踪图像中每个键的轮廓。然后,如果您想显示一个按下键 1 和 4 的图像(例如),您可以将它们作为数组传递给 getPianoImage(Context context, int[] pressedKeyIndices) 函数。该函数返回您可以显示的位图
  • 好的,我搞定了。我复制它来测试性能是否有改善,仍然没有改善。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多