Android 设置ImageView的ImageBitmap后,onmeasure方法的时间过长
长时间的读者,第一次提问,所以请温柔一点;) 我有一个Android代码,在ImageView上每秒显示大约10张图片。 (在ImageView上调用setImageBitmap以设置新位图) 这会导致显示滞后,所以我正试图尽可能加快速度 我发现(使用traceview)该应用程序在方法上花费了大量时间:Android 设置ImageView的ImageBitmap后,onmeasure方法的时间过长,android,android-imageview,Android,Android Imageview,长时间的读者,第一次提问,所以请温柔一点;) 我有一个Android代码,在ImageView上每秒显示大约10张图片。 (在ImageView上调用setImageBitmap以设置新位图) 这会导致显示滞后,所以我正试图尽可能加快速度 我发现(使用traceview)该应用程序在方法上花费了大量时间: ViewRoot.performTraversals View.measure FrameLayout.onmeasure ViewGrou.measureChildWithMargins
ViewRoot.performTraversals
View.measure
FrameLayout.onmeasure
ViewGrou.measureChildWithMargins
我怀疑ImageView测量,所以我创建了CustomImageView和OverideOnMeasure,只是为了调用super方法并编写sysout
似乎在每次设置ImageBitmap onmeasure后都会调用3次。
位图的大小都是一样的,所以没有变化。实际上,当图像源改变时,它可以不时地改变,但只有在那个时才应该重新测量
我可以做些什么改变来消除这种测量对应用程序速度的影响
如果你需要更多的信息,告诉我,我会提供的
示例代码
final Bitmap bitmapScaled = Bitmap.createScaledBitmap(bitmap2, width, height, false);
imageView2.setScaleType(ScaleType.CENTER_INSIDE);
if (setSize) {
setSize(imageView2, width, height);
}
imageView2.setImageBitmap(bitmapScaled);
我更改的方法使其工作更快(可能不安全?!)
当我遇到类似问题时,我做了以下操作:
public class ImageViewEx extends ImageView{
private boolean makeRequest;
public ImageViewEx(Context context){
super(context);makeRequest=true;
}
public ImageViewEx(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ImageViewEx(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
makeRequest=true;
}
public void setImageBitmapNoRequestLayout(Bitmap bitmap) {
makeRequest = false;
setImageBitmap(bitmap);
makeRequest = true;
}
@Override public void requestLayout(){
if(makeRequest)super.requestLayout();
}
}
现在,使用
setImageBitMapNorRequestLayout(…)
更改位图不会调用requestLayout()
一段代码,让我们能够复制并帮助您解决问题,怎么样?这似乎不是一个任何人都可以在没有代码上下文的情况下跳入的明显问题。Snippent不会更改匹配,因为经常这样做时,问题只存在于一行setImageBitmap中。我用自定义的图像视图和requestlayout方法的覆盖来解决这个问题。我改变了这个方法,所以它会调用super 10次,不再调用了,它可以工作,节省了很多时间。仍然对正确的解决方案感兴趣,因为我不确定这是否会让我在其他地方头疼。只需使用随机图片将ImageBitmap设置10次,看看如何改善延迟?我只是对10张照片的滞后感到惊讶。这就是为什么我要求提供代码片段,以查看是否存在导致此问题的任何其他问题。作为长期读者,您应该知道代码片段如何帮助任何人回答特定问题并更好地理解上下文,当然感谢您的参与:)
public class ImageViewEx extends ImageView{
private boolean makeRequest;
public ImageViewEx(Context context){
super(context);makeRequest=true;
}
public ImageViewEx(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ImageViewEx(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
makeRequest=true;
}
public void setImageBitmapNoRequestLayout(Bitmap bitmap) {
makeRequest = false;
setImageBitmap(bitmap);
makeRequest = true;
}
@Override public void requestLayout(){
if(makeRequest)super.requestLayout();
}
}