Подтвердить что ты не робот

Рисование над представлением и все это дети

Я пытаюсь применить визуальный эффект к группе просмотра. Моя идея состоит в том, чтобы захватить растровое изображение группы просмотра, сжать его, развернуть и снова нарисовать поверх группы просмотра, чтобы сделать его блочным, низким качеством.

У меня есть большая часть пути использования этого кода:

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);
    }
}

Я просто передаю в холст, чтобы рисовать, и растровое изображение того, что нужно масштабировать + вверх, и оно работает хорошо.

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());
    }
}

Проблема, с которой я столкнулась, находится в моей группе просмотра. Если я запускаю метод block в drawgroup draw, он рисует все, но никогда не обновляется, когда меняются детские представления. Я отслеживал вызовы функций с помощью Log, и метод draw работает, но ничего не меняется.

Я также попытался реализовать это в onDraw. Это рисует растровое изображение позади всех представлений детей, и снова они не обновляются.

Кто-нибудь может объяснить, как я могу это исправить?

4b9b3361

Ответ 1

Попробуйте следующее:

@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() каждый раз, когда вы меняете ребенка.

Ответ 2

Метод Draw() будет хорошо работать для вас.

Сейчас я пытаюсь сделать вид отсчета времени в форме круга, когда время проходит, вид уменьшит его угол. Используется для покрытия фотографии профиля (фото в форме круга).