在android'中快速绘制位图;s图像视图

在android'中快速绘制位图;s图像视图,android,android-canvas,android-imageview,draw,picasso,Android,Android Canvas,Android Imageview,Draw,Picasso,我有一个从ImageView扩展的类(实际上有三个类从一个扩展到另一个,但这并不相关),用于围绕ImageView绘制的可绘制图形执行一些自定义绘制。现在,我的代码很好(或者至少我认为很好,在分析了它之后,它只需要几毫秒就可以运行了),但是当设置图像(作为位图加载的图像)时,所有东西都会挂起大约500毫秒,不是很多,但足够引人注目 不幸的是,这个类必须在GridView(或ListView)中使用,并且一切都很好,直到图像加载(通过,所以显然我的问题不是在主线程上加载图像)之后,图像才在Imag

我有一个从ImageView扩展的类(实际上有三个类从一个扩展到另一个,但这并不相关),用于围绕ImageView绘制的可绘制图形执行一些自定义绘制。现在,我的代码很好(或者至少我认为很好,在分析了它之后,它只需要几毫秒就可以运行了),但是当设置图像(作为位图加载的图像)时,所有东西都会挂起大约500毫秒,不是很多,但足够引人注目

不幸的是,这个类必须在GridView(或ListView)中使用,并且一切都很好,直到图像加载(通过,所以显然我的问题不是在主线程上加载图像)之后,图像才在ImageView中设置。现在,由于每个ImageView显示图像需要数百毫秒,因此如果正在设置图像,则GridView会在滚动时滞后

现在,正如您从下图(DDMS提供的方法分析结果)中所看到的,花费如此多时间的是方法
GLES20Canvas.nDrawDisplayList

注意:图像被缩小到比ImageView小一点的大小,因此已经尝试过此解决方案

现在我要问的问题是:如何以高效、快速的方式显示此位图

提前谢谢大家

编辑:按照

现在,其他三个子类有一个非常相似的代码,显然,
mneedraw
标志仅在真正需要时设置,因为它重新计算正确绘图所需的所有内容(但始终重用对象,在
updateatrs()
方法中不进行对象分配)

为了完整起见:

第一个子类的绘图:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (mBackgroundPaint != null && mBackgroundPath != null) {
        canvas.drawPath(mBackgroundPath, mBackgroundPaint);
        canvas.drawTextOnPath(mText, mBackgroundPath, mHorizontalOffset, mMidTextHeight, mTextPaint);
        if (mIcon != null && mIconTransformationMatrix != null) {
            canvas.drawBitmap(mIcon, mIconTransformationMatrix, mTextPaint);
        }
    }
}

@Override
public boolean onPreDraw() {
    boolean result = super.onPreDraw();
    if (mFooNeedRedraw)
        updateAttrs();
    return result;
}
@Override
public boolean onPreDraw() {
    boolean result = super.onPreDraw();
    if (mBarNeedRedraw)
        updateAttrs();
    return result;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (mArc != null && !isInEditMode()) { 
        canvas.drawPath(mArc, mArcPaint);
    }
}
@Override
public boolean onPreDraw() {
    boolean result = super.onPreDraw();
    if (mBazNeedRedraw || mTrackNeedRedraw)
        updateAttrs();
    return result;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if(mTrackVisible)
        canvas.drawBitmap(mThumbTrackIcon, mThumbIconTransformationMatrix, mThumbPaint);
}
第二个子类的绘图:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (mBackgroundPaint != null && mBackgroundPath != null) {
        canvas.drawPath(mBackgroundPath, mBackgroundPaint);
        canvas.drawTextOnPath(mText, mBackgroundPath, mHorizontalOffset, mMidTextHeight, mTextPaint);
        if (mIcon != null && mIconTransformationMatrix != null) {
            canvas.drawBitmap(mIcon, mIconTransformationMatrix, mTextPaint);
        }
    }
}

@Override
public boolean onPreDraw() {
    boolean result = super.onPreDraw();
    if (mFooNeedRedraw)
        updateAttrs();
    return result;
}
@Override
public boolean onPreDraw() {
    boolean result = super.onPreDraw();
    if (mBarNeedRedraw)
        updateAttrs();
    return result;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (mArc != null && !isInEditMode()) { 
        canvas.drawPath(mArc, mArcPaint);
    }
}
@Override
public boolean onPreDraw() {
    boolean result = super.onPreDraw();
    if (mBazNeedRedraw || mTrackNeedRedraw)
        updateAttrs();
    return result;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if(mTrackVisible)
        canvas.drawBitmap(mThumbTrackIcon, mThumbIconTransformationMatrix, mThumbPaint);
}
最后是最后一个子类的代码:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (mBackgroundPaint != null && mBackgroundPath != null) {
        canvas.drawPath(mBackgroundPath, mBackgroundPaint);
        canvas.drawTextOnPath(mText, mBackgroundPath, mHorizontalOffset, mMidTextHeight, mTextPaint);
        if (mIcon != null && mIconTransformationMatrix != null) {
            canvas.drawBitmap(mIcon, mIconTransformationMatrix, mTextPaint);
        }
    }
}

@Override
public boolean onPreDraw() {
    boolean result = super.onPreDraw();
    if (mFooNeedRedraw)
        updateAttrs();
    return result;
}
@Override
public boolean onPreDraw() {
    boolean result = super.onPreDraw();
    if (mBarNeedRedraw)
        updateAttrs();
    return result;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (mArc != null && !isInEditMode()) { 
        canvas.drawPath(mArc, mArcPaint);
    }
}
@Override
public boolean onPreDraw() {
    boolean result = super.onPreDraw();
    if (mBazNeedRedraw || mTrackNeedRedraw)
        updateAttrs();
    return result;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if(mTrackVisible)
        canvas.drawBitmap(mThumbTrackIcon, mThumbIconTransformationMatrix, mThumbPaint);
}
就这些。现在,
updateAttrs()
是一个私有方法,在子类中它们之间没有关系,我已经检查了它被调用了多少次,对于我的测试,在第一次创建/活动时似乎只被调用了两次


有什么想法吗?

问题是为什么要扩展ImageView?为什么我不应该?ImageView可以方便地自动对图像进行各种转换(fitCenter、centerCrop等)。这就是为什么如果您希望“围绕可绘制的图形进行自定义绘制”,我会首选扩展类的原因然后子类不是ImageView而是Drawable,如果您想让它更简单,您可以使用现有的Drawable子类中的一个代码。您在自定义绘图代码中做什么?听起来像是在主线程上为它分配位图和绘图。