2

私が欲しいのは、ダッシュボード ボタンをクリックすると、SlidingDrawer のように開き、もう一度クリックすると閉じます。SlidingDrawer は非推奨であるため、このカスタム ドロワーを使用します。

今問題は、最初にボタンをクリックしたときを除いて、アニメーションなしで非常に速く開きますが、適切に閉じ、その後は正常に動作することです。

RelativeLayout Visible を作成し、その getHeight() を計算しようとすると、最初はゼロになり、その後適切な高さが得られることが問題であることがわかりました。

LogCat は次のとおりです。

ここに画像の説明を入力 これが私のXMLファイルです。

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relLayOne"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:background="#0000" >

    <Button
        android:id="@+id/btnNEWCLICK"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:background="@drawable/dashboard" />

    <RelativeLayout
        android:id="@+id/relLayTwo"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btnNEWCLICK"
        android:background="#000"
        android:visibility="gone" >

        <Button
            android:id="@+id/loc"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="5dp"
            android:layout_marginTop="5dp"
            android:background="#000"
            android:gravity="left|center_vertical"
            android:paddingLeft="5dp"
            android:text="My Location"
            android:textColor="#fff"
            android:textSize="20sp" />

        <View
            android:layout_width="0.1dp"
            android:layout_height="108dp"
            android:layout_centerInParent="true"
            android:layout_marginBottom="15dp"
            android:layout_marginTop="15dp"
            android:background="#fff" />

        <Button
            android:id="@+id/phot"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="5dp"
            android:background="#000"
            android:gravity="left|center_vertical"
            android:paddingLeft="5dp"
            android:text="Photos"
            android:textColor="#fff"
            android:textSize="20sp" />

        <View
            android:layout_width="fill_parent"
            android:layout_height="0.1dp"
            android:layout_below="@+id/phot"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:background="#fff" />

        <Button
            android:id="@+id/free"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/loc"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="5dp"
            android:layout_marginTop="5dp"
            android:background="#000"
            android:gravity="left|center_vertical"
            android:paddingLeft="5dp"
            android:text="Free stuff"
            android:textColor="#fff"
            android:textSize="20sp" />

        <Button
            android:id="@+id/leade"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_below="@+id/phot"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="5dp"
            android:background="#000"
            android:gravity="left|center_vertical"
            android:paddingLeft="5dp"
            android:text="Leaderboard"
            android:textColor="#fff"
            android:textSize="20sp" />

        <View
            android:layout_width="fill_parent"
            android:layout_height="0.1dp"
            android:layout_below="@+id/leade"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:background="#fff" />

        <Button
            android:id="@+id/live"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/free"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="5dp"
            android:layout_marginTop="5dp"
            android:background="#000"
            android:gravity="left|center_vertical"
            android:paddingLeft="5dp"
            android:text="Live Action"
            android:textColor="#fff"
            android:textSize="20sp" />

        <Button
            android:id="@+id/home"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_below="@+id/leade"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="5dp"
            android:background="#000"
            android:gravity="left|center_vertical"
            android:paddingLeft="5dp"
            android:text="Home"
            android:textColor="#fff"
            android:textSize="20sp" />

        <View
            android:layout_width="fill_parent"
            android:layout_height="0.1dp"
            android:layout_below="@+id/home"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:background="#fff" />

        <Button
            android:id="@+id/app"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/live"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="5dp"
            android:layout_marginTop="5dp"
            android:background="#000"
            android:gravity="left|center_vertical"
            android:paddingLeft="5dp"
            android:text="App stats"
            android:textColor="#fff"
            android:textSize="20sp" />
    </RelativeLayout>

</RelativeLayout>

ここにコードがあります::

public class MoveView extends LinearLayout{
     private Button openCloseButton;
     private boolean isVisible = false;
     private RelativeLayout relLayTwo, relLayOne;
     private float animationHeight = 300.0f;

    public MoveView(Context context , AttributeSet attr) {
        super(context, attr);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.in, this);

        relLayTwo = (RelativeLayout) findViewById(R.id.relLayTwo);
        //relLayOne = (RelativeLayout) findViewById(R.id.relLayOne);
        openCloseButton = (Button) findViewById(R.id.btnNEWCLICK);

        openCloseButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                toggle();
            }
        });

        Log.d("test", "before "+relLayTwo.getHeight());
        if (relLayTwo.getHeight() == 0){
            relLayTwo.setVisibility(View.VISIBLE);
            relLayTwo.invalidate();
            relLayTwo.refreshDrawableState();
            //rel.setVisibility(View.INVISIBLE);
            relLayTwo.setVisibility(View.GONE);
            Log.d("test", "after "+relLayTwo.getHeight());
        }

    }



    public void toggle() {
        TranslateAnimation anim = null;
        isVisible = !isVisible;

        if (isVisible) {
            relLayTwo.setVisibility(View.VISIBLE);
            anim = new TranslateAnimation(0.0f, 0.0f, relLayTwo.getHeight(), 0.0f);
            Log.d("test", " rel Height "+relLayTwo.getHeight());
        } else {
            Log.d("test", " rel Height else "+relLayTwo.getHeight() );
            anim = new TranslateAnimation(0.0f, 0.0f, 0.0f, relLayTwo.getHeight());
            anim.setAnimationListener(collapseListener);
        }

        anim.setDuration(600);
        anim.setInterpolator(new AccelerateInterpolator(1.0f));
        startAnimation(anim);
    }

    Animation.AnimationListener collapseListener = new Animation.AnimationListener() {
        public void onAnimationEnd(Animation animation) {
            relLayTwo.setVisibility(View.GONE);
        }

        public void onAnimationRepeat(Animation animation) {
            // not needed
        }

        public void onAnimationStart(Animation animation) {
            // not needed
        }
    };
}

onMeasure() メソッドを使用します。

@
Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        Log.d("test", " RelativeLAyout In onMeaseure "+relLayTwo.getHeight() );

    }

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

4

4 に答える 4

1

これを使用してheightwidthどの可視性が失われたかを取得します..

myView.getMeasuredHeight();
myView.getMeasuredWidth();
于 2014-01-28T09:41:51.247 に答える
1

これが私がこの問題の解決策を得た方法です。

コンテンツをラップするように設定したときにレイアウトの高さを取得する際の実際の問題は、実際に画面に描画されるまで高さが得られないことです。私の場合、カスタムレイアウトが最初に呼び出され、次に残りのレイアウトが呼び出されるため、レイアウトが描画される可能性はありません。

だから私がしたことは、次のコードを使用して、画面の実行時間の実際の高さと幅を取得したことです。

DisplayMetrics metrics = new DisplayMetrics();
        ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(metrics);
        height  =   metrics.heightPixels;
        width   =   metrics.widthPixels; 

画面の高さと幅を取得した後、ビューを膨らませます。その後、linearlayouts の高さを取得し、次のコードを使用して新しい高さを追加します。

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) relLayTwo.getLayoutParams();
    Log.d("test", "height "+params.height);
    params.height = height*40/100;
    relLayTwo.setLayoutParams(params);
    relLayTwo.setVisibility(View.GONE);

そしてそれは働いた!!

于 2013-03-13T13:14:25.020 に答える
1

View が最初に作成されたとき、 onMeasure() が呼び出されるまで、その幅と高さは利用できません。このため、最初に値を取得しようとすると、まだ割り当てられていません。

カスタム ビューを使用しているため、ソリューションは非常に単純です。高さと幅を取得するコードを onMeasure() に移動し、その後で使用するだけです。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    width = getWidth(); // Get View Width
    height = getHeight();// Get View Height
} 
于 2013-01-30T07:15:12.553 に答える
0
<RelativeLayout
        android:id="@+id/relLayTwo"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btnNEWCLICK"
        android:background="#000"
        android:visibility="gone" > //don't put gone in xml

OnViewCreated で高さを探し、その後このビューを GONE にします

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
         relLayTwo = (RelativeLayout) findViewById(R.id.relLayTwo);
         mHeight = relLayTwo.getHeight();
         relLayTwo.setVisibility(View.GONE);}

onViewCreated ではビューが既に描画されているため、この方法で高さを取得し、必要なものを取得したらビューを GONE にします。

于 2014-09-01T15:35:08.600 に答える