以编程方式使查看android变暗

时间:2011-07-05 11:19:38

标签: android

我找到了如何change the opacity of a 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被添加到FrameLayoutR.drawable.black_background指向一个787像素x 492像素的黑色png图像。

我添加了overlay.setWillNotDraw(false);,但没有帮助。 我将第一个setAlpha(0)更改为setAlpha(255),但这没有用。 我完全删除了setAlpha()个来电,但没有帮助。

这种添加PageNNAnimationView的基本技巧一直在绘制Bitmaps,而不是绘制ImageView overlay。 (我会使用Bitmaps,但它们似乎没有alpha组件。)

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

8 个答案:

答案 0 :(得分:28)

如果是ImageView,这是实现它的一种方法:

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

答案 1 :(得分:11)

我宁愿以相反的方式做 - 在视图后面放一个黑色矩形并设置视图的不透明度。这样可以在视图100%不透明时保存绘制矩形。

答案 2 :(得分:6)

我会做这样的事情:

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

对于典型的变暗,使用带有0x7f000000之类字母的黑色。

它更简洁,您也可以使用动画或滚动事件使View变暗。只需将Color.argb(alpha, 0, 0, 0)设置为颜色和动画alpha,或根据滚动偏移更改它。

答案 3 :(得分:2)

这就是我最终这样做的方式。关键是使用Paint将其alpha设置为我想要的任何值。

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

答案 4 :(得分:2)

添加到Android开发者的答案:

private int[] num;

public void asignar(int n[])
{

    for(int i=0; i<n.length; i++)
    {
        num[i] = n[i];
    }
}

你可以在任何这样的视图上设置setColorFilter:

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

答案 5 :(得分:1)

您可以尝试使用这样的Alpha动画(可能在矩形上):

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

这会导致矩形在350秒内逐渐变得不透明......

答案 6 :(得分:0)

您应该在this question中查看iPaulPro的答案。您需要扩展ImageView并覆盖onDraw()方法。

根据您的目的,Alexandru Cristescu的答案也是有效的,但您应该这样做 调用setFillAter(true)以使动画在完成后保持不变。

答案 7 :(得分:0)

Android实际上公开了一个可用于使视图变暗的可绘制对象。您可以使用叠加层轻松将其附加到任何视图。

这里有两个扩展功能,可用于使任何视图变暗。

fun View.darken() {
    val darkOverlay = ResourcesCompat.getDrawable(
            resources,
            android.R.drawable.screen_background_dark_transparent,
            context.theme
    )!!.mutate() // We mutate the drawable so we can later implement a fade in/out animation and animate the Drawable's alpha property. Since Drawables share their state we need to mutate otherwise we would impact all instances of this drawable
    darkOverlay.setBounds(0, 0, width, height)
    setTag(R.id.dark_overlay, darkOverlay)
    overlay.add(darkOverlay)
}

fun View.lighten() {
    (getTag(R.id.dark_overlay) as? Drawable)?.let {
        overlay.remove(it)
        setTag(R.id.dark_overlay, null)
    }
}

确保将ID添加到ids.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="dark_overlay" type="id" />
</resources>

如果您要使应用程序的根目录布局变暗,并且也想使NavigationBar变暗,则可能需要将以下内容添加到{{1}中的主题中}

styles.xml