我已经搜索过并在这个主题上找到了很多,但没有一个答案对我有帮助。
我的程序是一台鼓机,实际上它运行正常,可以解决这个延迟错误。
可视化架构如下: HorizontalScrollView包含LinearLayout(LayoutRhythm,vertical)。 此布局包含每个轨道的一个Linearlayout。 TrackLayout(水平)包含每个声音的多个ImageView。
仅为想象力:
HorizontalScrollView
rhythmLayout
trackLayout ImageView ImageView ImageView ... ImageView ImageView trackLayout
trackLayout ImageView ImageView ImageView ... ImageView ImageView trackLayout
trackLayout ImageView ImageView ImageView ... ImageView ImageView trackLayout
/ rhythmLayout
/ HorizontalScrollView
第一个位置是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是问题吗?
任何人都可以帮助我吗?
答案 0 :(得分:0)
你的基本问题是Android并不喜欢在同一(或多或少)时间内在屏幕上放置多个图像视图。特别是当你试图使它适用于其中的200个时。
要解决您的问题,请告诉我为什么您选择使用多个imageView而不是只绘制一个?
我知道这是一个迟到的答案,希望你已经解决了。如果是这样,请分享您的解决方案。