【问题标题】:How can I set an entire view's alpha value in api level 7 (Android 2.1)如何在 api 级别 7 (Android 2.1) 中设置整个视图的 alpha 值
【发布时间】:2011-08-13 04:12:24
【问题描述】:

我有一个任意视图,我想在另一个视图之上淡入。在 api 级别 11 中,我看到有一个 setAlpha,但我坚持支持 api 级别 7。我还没有遇到一个简单的方法来做到这一点。如何在不弄乱每个单独组件的情况下为整个视图设置 alpha?

【问题讨论】:

    标签: android transparency transition alpha


    【解决方案1】:

    对于大多数过渡来说,使用 AlphaAnimation 将是一个很好的解决方案,如果我找不到一种方法来完全按照我想要做的事情(这涉及以基于渐变的方式在两个视图之间淡入淡出),那肯定对我有用关于设备的倾斜角度。幸好我有!这是我采取的策略:我将视图包装在 FrameLayout 的自定义子类中,并实现 onDraw。在那里,我将子视图捕获为位图,然后使用预期的 alpha 重新绘制位图。这是一些代码。清理完毕后我会进行编辑,这只是概念验证,但它的作用就像一个魅力:

    public class AlphaView extends FrameLayout {
        private int alpha = 255;
    
        public AlphaView(Context context) {
            super(context);
            setWillNotDraw(false);
        }
    
        public AlphaView(Context context, AttributeSet attrs) {
            super(context, attrs);
            setWillNotDraw(false);
        }
    
        public AlphaView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            setWillNotDraw(false);
        }
    
        public void setCustomAlpha(int alpha) {
            if (this.alpha != alpha) {
                this.alpha = alpha;
                invalidate();
            }
        }
    
        public int getCustomAlpha() {
            return alpha;
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            for(int index = 0; index < getChildCount(); index++ ) {
                View child  = getChildAt(index);
                child.setVisibility(View.INVISIBLE);
                child.setDrawingCacheEnabled(true);
                Bitmap bitmap = child.getDrawingCache(true);
                bitmap = Bitmap.createBitmap(bitmap);
                child.setDrawingCacheEnabled(false);
                Paint paint = new Paint();
                paint.setAlpha(alpha);
                canvas.drawBitmap(bitmap, 0, 0, paint);
            }
        }
    }
    

    【讨论】:

    • 我没有注意到。您的结果可能会有所不同。
    【解决方案2】:

    您应该能够使用 API 级别 7 的 AlphaAnimation 实现合理的效果。

        View v = findViewById(R.id.view2);
    
        AlphaAnimation aa = new AlphaAnimation(0f,1f);
        aa.setDuration(5000);
        v.startAnimation(aa);
    

    【讨论】:

    • 啊拍...我不怎么用动画。这绝对是要走的路。我谦虚地添加我的赞成票。
    • @Maximus @slund 看看吧!我想出了如何做一般的阿尔法。
    • 补充一点:使用神话般的 NineOldAndroids 库,它也可以在两行代码中运行。
    【解决方案3】:

    这取决于视图类型。

    对于 TextView,在 xml 中您可以具有以下属性:

    android:background="#00000000"
    android:textColor="#77FFFFFF"
    

    前两个数字是从 00 到 FF(十六进制)的 alpha 值。 背景将是完全透明的,而文本将是部分透明的白色。我没有对此进行测试,但它应该可以工作。

    如果您的背景是图像,那么最简单的做法是预先创建具有透明度的 png 可绘制对象。

    【讨论】:

    • 我所拥有的是几种不同类型的视图(一些自定义绘制),它们都存在于一个 RelativeLayout 上。我希望能够在 RelativeLayout 上设置 alpha,而不是弄乱所有众多的孩子。
    • 我不相信 API 级别 7 是可能的......但如果其他人知道得更好,他们将不得不来分享一个解决方案......
    • 毫无疑问,通过 slund 的回答,我意识到了我的想法。
    • 可悲的是,在 Android 中......“一切皆有可能”并不是真的。
    猜你喜欢
    • 2011-09-19
    • 2012-08-09
    • 2011-06-23
    • 2019-09-29
    • 2014-04-14
    • 2018-05-28
    • 2011-02-19
    • 2011-08-01
    • 2014-04-19
    相关资源
    最近更新 更多