查看Canvas Visibility问题

时间:2011-10-25 10:48:10

标签: android android-layout android-canvas

我有这个布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<com.components.game.GameView
    android:id="@+id/game_id"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

<RelativeLayout
    android:id="@+id/ChatLayout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:visibility="invisible"
    android:focusable="true"
    android:focusableInTouchMode="true" >

    <Button
        android:id="@+id/ChatCancelButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="X" />

    <Button
        android:id="@+id/ChatOkButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="OK" />

    <EditText
        android:id="@+id/ChatEditText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@+id/ChatOkButton"
        android:layout_toRightOf="@+id/ChatCancelButton"
        android:maxLength="50"
        android:singleLine="true" />
</RelativeLayout>

</RelativeLayout>

它是画布上的RelativeLayout。在开始时它是不可见的,但是当用户单击按钮时,布局应该变得可见。 问题是它没有变得可见。布局在那里,但它不是绘制它。如果我按下布局应该出现的位置,它会接收事件并打开键盘,但它不会绘制整个布局。 有什么问题?

如果我将RelativeLayout设置为开头可见,则可以正常工作。它显示了布局,如果我在不可见和可见之间切换它可以正常工作。

我做了一个几乎总是有效的解决方法。 我启动布局是可见的,而不是在oncreate中执行:

chatLayout.postDelayed(new Runnable() {

        @Override
        public void run() {
            chatLayout.setVisibility(View.INVISIBLE);

        }
    }, 50);

但我不喜欢它,想要了解问题所在。

代码:

它从画布按钮开始,它向处理程序发送消息:

public void showInputLayout() {
    Message.obtain(gameHandler, SHOW_INPUT_LAYOUT).sendToTarget();
}

在处理程序中:

case SHOW_INPUT_LAYOUT:
                    gameActivity.setChatVisibility(true);
                    break;

setChatVisibility:

public void setChatVisibility(boolean isVisible) {
    int visible = isVisible ? View.VISIBLE : View.INVISIBLE;
    chatLayout.setVisibility(visible);
    if(isVisible){
        chatEditText.setFocusable(true);
        chatEditText.requestFocus();
    }
}

2 个答案:

答案 0 :(得分:0)

RelativeLayout添加点击监听器,并在GONEVISIBLE之间切换可见性。尝试这样的事情:

int visibility = View.VISIBLE;
RelativeLayout layout = (RelativeLayout)findViewById(R.id.ChatLayout);
layout.setVisibility(visibility);
layout.setOnClickListener(new View.OnClickListener{
    public void onClick(View v)
    {
        if(visibility == View.VISIBLE)
            visibility = View.GONE;
        else
            visibility = View.VISIBLE;

        v.setVisibility(visibility);
    }
})

答案 1 :(得分:0)

我最近遇到了类似的问题,对于我的情况,问题实际上是在下面的视图的onDraw()方法中(在你的情况下应该是com.components.game.GameView)。看看您是否可以在绘图代码中添加对Canvas'getSaveCount()save()restoreToCount()的调用,类似于:

@Override 
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    int saveCount = canvas.getSaveCount();
    canvas.save();

    // custom drawing code here ...
    // use Region.Op.INTERSECT for adding clipping regions

    canvas.restoreToCount(saveCount);
}

我相信所发生的事情是,在我们调用onDraw()方法之前,框架有时会在Canvas-drawing小部件的顶部设置剪切区域,因此我们需要确保保留这些区域。

希望这有帮助。