Android Studio - 如何创建显示在当前视图上方的透明视图
Android Studio - How to create a transparent view that displays above current view
所以我有一个 activity,它有自己的 XML 文件,我有单独的视图,它只使用 canvas 而没有 xml。代码在这里解释,问题和问题在代码下面。
这是第一个视图,使用 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);
}
下面是调用上述视图的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 停留在视图中,只是在后台,XML 文件中的按钮显示在它上面。这将允许 ballView(基本上被冻结)和按钮可以被点击。
我查看了整个堆栈溢出,所有解决方案都使用透明 activity 背景(但随后更改 setContentView(activity_main) 会清除之前的视图,如果透明也无所谓或者,他们只是在同一个 XML 文件中定义所有内容,这样他们就可以简单地将 ContentView 设置到那个 XML 文件并且很好。请注意,我不能这样做,因为我的一个视图使用 Canvas 而另一个使用 XML。
那么如何同时显示 2 个视图,一个透明地显示在另一个下方?
为什么不在 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
}
}
所以我有一个 activity,它有自己的 XML 文件,我有单独的视图,它只使用 canvas 而没有 xml。代码在这里解释,问题和问题在代码下面。
这是第一个视图,使用 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);
}
下面是调用上述视图的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 停留在视图中,只是在后台,XML 文件中的按钮显示在它上面。这将允许 ballView(基本上被冻结)和按钮可以被点击。
我查看了整个堆栈溢出,所有解决方案都使用透明 activity 背景(但随后更改 setContentView(activity_main) 会清除之前的视图,如果透明也无所谓或者,他们只是在同一个 XML 文件中定义所有内容,这样他们就可以简单地将 ContentView 设置到那个 XML 文件并且很好。请注意,我不能这样做,因为我的一个视图使用 Canvas 而另一个使用 XML。
那么如何同时显示 2 个视图,一个透明地显示在另一个下方?
为什么不在 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
}
}