Android Studio - 如何创建一个透明视图,显示在当前视图之上

3

我有一个活动,有自己的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);
}

以下是相关视图调用的活动内容:
```xml

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

```
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(基本上被冻结)和按钮可以被点击。
我已经在Stack Overflow上搜索了很久,所有的解决方案都使用透明的活动背景(但是改变setContentView(activity_main)会擦除上一个视图,无论是透明还是不透明都没有影响)。或者,他们仅仅在同一XML文件中定义所有内容,这样他们就可以简单地将setContentView设置为该XML文件,然后就可以了。请注意,我不能这样做,因为我的一个视图使用Canvas,另一个使用XML。
那么,如何同时显示2个视图,其中一个透明地位于另一个下面呢?
1个回答

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

1
最好的解释可以在Android开发者网站上找到。http://developer.android.com/training/custom-views/create-view.html - Numan1617
1
但是AttributeSet允许您在XML中定义某些内容,例如球的颜色,然后稍后在代码中设置。这些构造函数的设置方式是,无论您调用哪个构造函数,都会调用具有您设置的内容的构造函数。因为第一个调用第二个,第二个调用第三个。请注意每个构造函数的参数数量。 - Numan1617
1
它应该显示,因为您已以类似的方式包含了它。 <com.packagename.BallView> 将允许您向其中添加布局参数,如 android:layout_height="match_parent"。 - Numan1617
1
你的BallView中的所有内容都可以保持不变,但是你需要至少添加构造函数。你只需要在XML中包含正确的包名和BallView,它就会显示出来。 - Numan1617
1
让我们在聊天中继续这个讨论 - Numan1617
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接