【问题标题】:Android Studio - How to create a transparent view that displays above current viewAndroid Studio - 如何创建显示在当前视图上方的透明视图
【发布时间】:2015-04-17 23:44:38
【问题描述】:

所以我有一个活动,它有自己的 XML 文件,并且我有单独的视图,它只使用画布并且没有 xml。代码在这里解释,问题和问题在代码下方。

这是第一个使用画布绘制的视图:

public class BallView extends View {
    public BallView (Context context) {
        super(context);
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();

        ...//create Ball objects
     }
}

实际在画布上绘制的球对象:

public Ball(int xMax, int yMax) {
    bounds = new RectF();
    paint = new Paint();
    ...(initialize variables)
}

public void begin(Canvas canvas){
    bounds.set(...);
    paint.setColor(...);
    canvas.drawOval(bounds, paint);
}

这是调用上述视图的活动:

public class CircleBounceScreen extends ActionBarActivity{
    View ballView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ballView = new BallView(this);
        setContentView(ballView);
        .... //do stuff
    }

    // some triggermethod
    public void trigger(){
        setContentView(R.id.activity_main);
        //fade the button in
        //wait for the button to be clicked
    }
}

现在,我在 activity_main XML 文件中有一个按钮

<LinearLayout
    ...alignment stuff >
    <Button android:id="@+id/restart_button"
        ...design stuff
        android:visibility="gone"/>
</LinearLayout>

ballView 执行一段时间后,它通过监听器让活动知道。这是我想要发生的事情; ballView 保持在视图中,就在后台,并且 XML 文件中的按钮显示在其上方。这将允许ballView(基本上被冻结)和按钮能够被点击。

我已经查看了堆栈溢出的所有内容,所有解决方案都使用透明的活动背景(但随后更改 setContentView(activity_main) 会清除先前的视图,并且是否透明无关紧要。)或者,它们只是定义了所有内容在同一个 XML 文件中,因此他们可以简单地将内容视图设置为该 XML 文件并且很好。请注意,我不能这样做,因为我的一个视图使用 Canvas 而另一个使用 XML。

那么如何同时显示 2 个视图,其中一个透明地位于另一个下方?

【问题讨论】:

    标签: android xml android-canvas transparency android-view


    【解决方案1】:

    为什么不在 XML 中包含球视图?

    <RelativeLayout>
        <Button android:id="@+id/restart_button"
            ...design stuff
            android:visibility="gone"/>
    
    
        <com.packagename.BallView
            android:id="@id/ball_view"/>
    </RelativeLayout>
    

    那么在视图中你可以这样做:

    public class CircleBounceScreen extends ActionBarActivity{
        View ballView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            .... //do stuff
        }
    
        // some triggermethod
        public void trigger(){
            // restart_button set visibility visible
            //fade the button in
            //wait for the button to be clicked
        }
    }
    

    您可能需要向 BallView 添加额外的构造函数以允许它在 XML 中膨胀:

    public class BallView extends View {
        public BallView (Context context) {
            this(context, null);
        }
    
        BallView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        BallView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            Display display = wm.getDefaultDisplay();
    
            ...//create Ball objects
        }
    }
    

    【讨论】:

    • 这在 Android 开发者网站上有最好的解释。 developer.android.com/training/custom-views/create-view.html
    • 但是 AttributeSet 允许您在 XML 中定义某些东西,例如球的颜色,您可以稍后在代码中设置。这些构造函数的设置方式是,无论您调用 3 个中的哪一个,都将调用您的设置。因为第一个叫第二个,第二个叫第三个。注意每个参数的数量。
    • 它应该被显示,因为你已经以与上面类似的方式包含它。 将允许您向其中添加布局参数,例如 android:layout_height="match_parent"
    • BallView 中的所有内容都可以保持不变,但您至少需要添加构造函数。您只需要在 XML 中包含正确的包名称的 BallView,它就会显示出来。
    猜你喜欢
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    相关资源
    最近更新 更多