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

Программно затемнить вид Android

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

Знаете ли вы более хороший способ сделать это?

public class Page07AnimationView extends ParentPageAnimationView {
    private final String TAG = this.getClass().getSimpleName();
    private ImageView overlay;
    private int mAlpha = 0;

    public Page07AnimationView(Context context) {
        super(context);
    }

    public Page07AnimationView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    protected void init()
    {
        overlay = new ImageView(mContext);
        overlay.setImageResource(R.drawable.black_background);
        overlay.setAlpha(0);
        overlay.setWillNotDraw(false);
        // make the PageAniSurfaceView focusable so it can handle events
        setFocusable(true);
    }

    protected void draw_bitmaps(Canvas canvas)
    {
        overlay.draw(canvas);
        update_bitmaps();
        invalidate();
    }

    public void update_bitmaps()
    {
        if(mAlpha < 250)
        {
            mAlpha += 10;
            overlay.setAlpha(mAlpha);
        }
    }
}

Этот код не делает то, что я надеялся. Page07AnimationView добавляется к FrameLayout по представлению, которое мне нужно затемнить. R.drawable.black_background указывает на черно-белое изображение размером 787px x 492px.

Я добавил overlay.setWillNotDraw(false);, но это не помогло. Я изменил первый setAlpha(0) на setAlpha(255), но это не помогло. Я вообще удалил вызовы setAlpha(), но это не помогло.

Эта базовая методика добавления PageNNAnimationView работает над рисованием Bitmaps, но не для рисования ImageView overlay. (Я бы использовал Bitmaps, но у них, похоже, нет альфа-компонента.)

Edit2: это родительский класс выше:

public class ParentPageAnimationView extends View {
    private final String TAG = this.getClass().getSimpleName();
    protected Context mContext;

    public ParentPageAnimationView(Context context) {
        super(context);
        mContext = context;
        init();
    }

    public ParentPageAnimationView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        init();
    }

    protected void init()
    {
    }

    protected void draw_bitmaps(Canvas canvas)
    {
        // will be overridden by child classes
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if(this.getVisibility() == View.VISIBLE)
        {
            if(canvas != null)
            {
                draw_bitmaps(canvas);
            }
        }
    }

    public void update_bitmaps() 
    {
        // will be overridden by child classes
    }

    public void elementStarted(PageElement _pageElement) {
        // Nothing in parent class
    }

    public void elementFinished(PageElement mElement) {
        // Nothing in parent class
    }
}
4b9b3361

Ответ 1

Я предпочел бы сделать это наоборот: поставьте темный прямоугольник за представление и задайте непрозрачность представления. Это сохраняет рисование прямоугольника, когда представление на 100% непрозрачно.

Ответ 2

В случае ImageView, вот один из способов его достижения:

imageView.setColorFilter(Color.rgb(123, 123, 123), android.graphics.PorterDuff.Mode.MULTIPLY);

Ответ 3

Я бы сделал что-то вроде этого:

view.getBackground().setColorFilter(color, PorterDuff.Mode.DARKEN);

Используйте черный цвет с некоторой альфой, например 0x7f000000 для типичного затемнения.

Это более сжато, и вы можете также затемнить View с помощью анимации или прокрутки. Просто установите Color.argb(alpha, 0, 0, 0) как цвет и анимировать alpha, или измените его на основе смещения прокрутки.

Ответ 4

Вот как я это сделал. Ключ должен был использовать Paint с его альфа-настройкой, чтобы я хотел.

public class Page07AnimationView extends ParentPageAnimationView {
    private final String TAG = this.getClass().getSimpleName();
    private Bitmap bitmap;
    private BitmapDrawable drawable;
    private ImageView overlay;
    private int which = -1;
    private long last_time;
    private Page07State state;
    private int mAlpha;
    private int maxAlpha;
    private Paint mPaint;
    private int _alpha_step;
    private int minAlpha;

    public enum Page07State {
        WAITING, DARKENING, DARKENED
    }

    public Page07AnimationView(Context context) {
        super(context);
    }

    public Page07AnimationView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    protected void init()
    {
        minAlpha = 0;
        mAlpha = minAlpha;
        _alpha_step = 5;
        maxAlpha = 255;
        mPaint = new Paint();
        mPaint.setAlpha(minAlpha);
        state = Page07State.WAITING;
        overlay = new ImageView(mContext);
        overlay.setImageResource(R.drawable.black_background);
        drawable = (BitmapDrawable) overlay.getDrawable();
        bitmap = drawable.getBitmap();
        last_time = 0;
    }

    protected void draw_bitmaps(Canvas canvas)
    {
        if(state != Page07State.WAITING)
        {
            DebugLog.d(TAG, "drawing " + Integer.toString(which));
            canvas.drawBitmap(bitmap, 0, 0, mPaint);
        }
        update_bitmaps();
        invalidate();
    }

    public void update_bitmaps()
    {
        if(state == Page07State.DARKENING)
        {
            if(mAlpha < maxAlpha)
            {
                if(System.currentTimeMillis() > last_time + 12)
                {
                    last_time = System.currentTimeMillis();
                    mAlpha += _alpha_step;
                    mPaint.setAlpha(mAlpha);
                }
            }
            else
            {
                state = Page07State.DARKENED;
            }
        }
    }

    public void runAnimation()
    {
        state = Page07State.DARKENING;
    }
}

Ответ 5

Добавление в ответ разработчика разработчика:

imageView.setColorFilter(Color.rgb(123, 123, 123), android.graphics.PorterDuff.Mode.MULTIPLY);

вы можете установитьColorFilter в любом виде, например:

GradientDrawable gd = (GradientDrawable) textView.getBackground();
gd.setColor(color); //you can also set BG color to a textview like this
gd.setColorFilter(Color.rgb(123, 123, 123), android.graphics.PorterDuff.Mode.MULTIPLY);

Ответ 6

вы могли бы попробовать использовать альфа-анимацию, как это (возможно, на прямоугольнике):

    Animation animation = new AlphaAnimation(0.0f, 1.0f);
    animation.setDuration(350);

Это приведет к тому, что прямоугольник постепенно станет непрозрачным в течение 350 секунд...

Ответ 7

Вы должны проверить ответ iPaulPro в на этот вопрос. Вам нужно будет расширить ImageView и переопределить метод onDraw().

В зависимости от того, что вы собираетесь делать, ответ Alexandru Cristescu также действителен, но вы должны вызовите setFillAter (true), чтобы анимация сохранялась после завершения.