Android Studio - 如何创建显示在当前 View 上方的透明 View

标签 android xml android-canvas transparency android-view

所以我有一个 Activity ,它有自己的 XML 文件,我有单独的 View ,它只使用 Canvas ,没有 xml。代码解释在这里,问题和问题在代码下面。

这是第一个 View ,使用 Canvas 绘制:

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

实际在 Canvas 上绘制的球对象:

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

下面是调用上述 View 的 Activity :

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 执行一段时间后,它会通过监听器通知 Activity。这是我想要发生的事情; ballView 停留在 View 中,只是在后台,XML 文件中的按钮显示在它上面。这将允许 ballView(基本上被卡住)和按钮可以被点击。

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

那么如何同时显示 2 个 View ,其中一个透明地显示在另一个下方?

最佳答案

为什么不在 XML 中包含球 View ?

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


    <com.packagename.BallView
        android:id="@id/ball_view"/>
</RelativeLayout>

然后在 View 中你可以做:

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 Studio - 如何创建显示在当前 View 上方的透明 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29711179/

相关文章:

xml - VB.net解析XML(属性)youtube gdata

c# - 如何通过LINQ遍历xml中的属性

android - 无法在Android Studio 2.2预览版上构建和运行应用

android - Println需要按摩,帮忙解密logcat

java - 使用 JAXB 从套接字解码 xml 后客户端被阻止

android - 按下按钮时不调用橡皮擦

Android Paint setShadowLayer() 忽略其 Paint 的颜色

Android:在位图/ Canvas 中拉伸(stretch)/挤压绘图

java - 为Android直播音频流

android - 我可以在android模拟器中使用ping命令吗