android - 设置imageView内容的延迟打嗝

时间:2014-02-20 16:56:49

标签: bitmap imageview drawable

我已经搜索过并在这个主题上找到了很多,但没有一个答案对我有帮助。

我的程序是一台鼓机,实际上它运行正常,可以解决这个延迟错误。

可视化架构如下: Horizo​​ntalScrollView包含LinearLayout(LayoutRhythm,vertical)。 此布局包含每个轨道的一个Linearlayout。 TrackLayout(水平)包含每个声音的多个ImageView。

仅为想象力:
Horizo​​ntalScrollView
rhythmLayout
trackLayout ImageView ImageView ImageView ... ImageView ImageView trackLayout
trackLayout ImageView ImageView ImageView ... ImageView ImageView trackLayout
trackLayout ImageView ImageView ImageView ... ImageView ImageView trackLayout
/ rhythmLayout
/ Horizo​​ntalScrollView

第一个位置是buildRhythm函数,我必须检查节奏,并将相应的png-image(大约665字节!)设置为所有imageViews。 第二个位置是ImageView的OnClick侦听器,它会更改自身的图像。

在我的buildRhythm方法中,我调用follwoing方法来获取ImageView:

private ImageView getRhythmImage(int playerTrackindex, int playerSoundIndex, int soundIndexViews, int zoomLevel){

    final ImageView sound = new ImageView(this);
    final int trackIndexViews=playerTrackindex+1;
    final int trackIndexPlayer = playerTrackindex;
    final int soundIndexPlayer=playerSoundIndex;

    if (soundIndexViews % zoomLevel == 0) {
    //sound.setBackgroundResource(R.drawable.strich);
    sound.setBackgroundDrawable(drawableStrich);
    }
    else {
    //sound.setBackgroundResource(0);
    sound.setBackgroundDrawable(null);
    }

    if(this.awesomePlayer.actualRhythm.tracks.get(playerTrackindex).sounds.get(playerSoundIndex).equals("1")){
         //sound.setImageResource(R.drawable.bob);
         sound.setImageBitmap(bitmapBob);
    }
    else{
        sound.setImageBitmap(bitmapnobob);
    }
    //sound.setImageDrawable(getRhythmDrawable(playerTrackindex, playerSoundIndex));
    //sound.setImageResource(getRhythmImageId(playerTrackindex, playerSoundIndex));
    sound.setId(playerSoundIndex);

    sound.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            awesomePlayer.changeRhythmElement(trackIndexPlayer, soundIndexPlayer);
            if(awesomePlayer.actualRhythm.tracks.get(trackIndexViews-1).sounds.get(soundIndexPlayer).equals("1")){

                sound.setImageBitmap(bitmapBob);
                //sound.setImageDrawable(drawableBob);
                //sound.setImageResource(R.drawable.bop);
                sound.invalidate();
            }
            else {
                sound.setImageBitmap(bitmapnobob);
                //sound.setImageDrawable(drawablenobob);
                //sound.setImageResource(R.drawable.nobop);
                sound.invalidate();
            }
        }
    });
    System.gc();
    return sound;
}

你看,起初我使用了sound.setImageResource(R.drawable.bop)来设置ImageView内容。 在android doc(http://developer.android.com/reference/android/widget/ImageView.html)中我发现,这个方法解码了UI线程中的资源,并且它可能导致延迟

“太棒了”我以为:) “我得到了解决方案”

所以我将所有内容都改为drawables,最重要的是: 我在我的OnCreate方法中设置了drawable,因此它们已经存在并且必须连接到imageViews。但没有改变。 然后我使用

将所有内容更改为位图
this.bitmapBob = BitmapFactory.decodeResource(getResources(), R.drawable.bop);
this.bitmapnobob = BitmapFactory.decodeResource(getResources(), R.drawable.nobop);

在我的OnCreate方法中。但没有改变。 我有多个轨道,每个都有大约100-200个ImageViews,但我在android中太新了,不知道为什么它会滞后。 更改ImageView图像的延迟时间约为2-3秒。

我是否以错误的方式使用Bitmap? 大量的ImageViews是问题吗?

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

你的基本问题是Android并不喜欢在同一(或多或少)时间内在屏幕上放置多个图像视图。特别是当你试图使它适用于其中的200个时。

要解决您的问题,请告诉我为什么您选择使用多个imageView而不是只绘制一个?

我知道这是一个迟到的答案,希望你已经解决了。如果是这样,请分享您的解决方案。