gpt4 book ai didi

android - 绘制 View 及其所有子项

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:31:29 24 4
gpt4 key购买 nike

我正在尝试将视觉效果应用到 View 组。我的想法是抓取 View 组的位图,将其缩小,再向上展开,然后将其绘制在 View 组上,使其呈现 block 状、低质量的效果。

我已经使用这段代码完成了大部分工作:

public class Blocker {

private static final float RESAMPLE_QUALITY = 0.66f; // less than 1, lower = worse quality


public static void block(Canvas canvas, Bitmap bitmap_old) {
block(canvas, bitmap_old, RESAMPLE_QUALITY);
}


public static void block(Canvas canvas, Bitmap bitmap_old, float quality) {
Bitmap bitmap_new = Bitmap.createScaledBitmap(bitmap_old, Math.round(bitmap_old.getWidth() * RESAMPLE_QUALITY), Math.round(bitmap_old.getHeight() * RESAMPLE_QUALITY), true);
Rect from = new Rect(0, 0, bitmap_new.getWidth(), bitmap_new.getHeight());
RectF to = new RectF(0, 0, bitmap_old.getWidth(), bitmap_old.getHeight());
canvas.drawBitmap(bitmap_new, from, to, null);
}
}

我只是传入要绘制的 Canvas 和需要按比例缩小+放大的位图,效果很好。

public class BlockedLinearLayout extends LinearLayout {

private static final String TAG = BlockedLinearLayout.class.getSimpleName();


public BlockedLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
applyCustomAttributes(context, attrs);
setup();
}


public BlockedLinearLayout(Context context) {
super(context);
setup();
}


private void setup() {
this.setDrawingCacheEnabled(true);
}


@Override
public void draw(Canvas canvas) {
super.draw(canvas);
// block(canvas); If I call this here, it works but no updates
}


@Override
public void onDraw(Canvas canvas) {
// block(canvas); If I call this here, draws behind children, still no updates
}

private void block(Canvas canvas) {
Blocker.block(canvas, this.getDrawingCache());
}
}

我遇到的问题是在我的 View 组中。如果我在 View 组的绘制中运行 block 方法,它会绘制所有内容,但不会在 subview 更改时更新。我用 Log 跟踪函数调用,draw 方法似乎正在运行,但没有任何变化。

我也试过在 onDraw 中实现它。这会在所有 subview 后面绘制位图,并且它们不会再更新。

谁能解释一下我将如何解决这个问题?

最佳答案

试试这个:

@Override
protected void dispatchDraw(Canvas canvas) {
// call block() here if you want to draw behind children
super.dispatchDraw(canvas);
// call block() here if you want to draw over children
}

每次更改子项时调用 destroyDrawingCache() 和 buildDrawingCache()。

关于android - 绘制 View 及其所有子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13346589/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com