1

おそらく私はここで間違った考えを持っていると思います - 誰かが私を正すことができますか? クリックするとパネルが表示されるラベルがあります-私はこれを panel.visible = true で行いました-実際にはかなり不格好ですが、スライドして開いてみたいと思います。

そこで、for-next ループを使用してパネルの高さを動的に変更し、タイマーで速度を上げようとしました。しかし、私は何か間違っています:

Sub button_click
For i = 1 to 500
counter = i
timer1.initialize("timer1", 50)
timer1.enabled = true
next
End sub

sub timer1_click
panel.height = counter
timer1.enabled=false
end sub

これにより、長い遅延が発生し、その後パネルが表示されます。私が求めていたものとはまったく異なります。単純に panel.height = xx と指定すると、パネルが再描画されますか、それともアニメーションを使用する必要がありますか?

ありがとう....

4

3 に答える 3

1

タイマーをループに入れて 500 回初期化しています。これにより、設定された間隔ではなく、タイマーが 500 回すぐに実行される場合があります。これにより、パネルを再描画する時間がなくなります。コードが正しかったとしても、50 の間隔は 5/100 秒で、500 回繰り返されると 25 秒です。座ってパネルが上がるのを見るのは長い時間です。

ただし、間隔を 1 に減らしても、デバイスとパネルのビュー数によっては、パネルを 500 回再描画するだけで同じくらいの時間がかかる場合があります。これは、一度に 1 ピクセル以上移動する必要があることを意味します。移動時間を妥当な秒数にするには、間隔 1 を使用して一度に 5 ピクセルずつ移動できますが、動きはあまりスムーズではありません。また、移動速度は、4 インチのスマートフォンから 10 インチのタブレットまで、デバイスによってかなり異なる場合があります。

Sub Activity_Create
   timer1.initialize("timer1", 1) 
   timer1.enabled = false
end sub

Sub button_click
   counter1 = 0 ' counter1 should be DIMed in Sub Globals
   timer1.enabled = true
end sub

Sub timer1_tick ' Note: not "time1_click"
   counter1 = counter1 + 5
   panel.Height = counter1
   if counter1 = 500 then
      timer1.enabled = false
   end if
End Sub
于 2011-10-29T16:37:33.727 に答える
0

本当にアニメーションを使用する必要があります。ここに良い例があります:

Android 左から右へのスライド アニメーション

于 2011-10-29T09:22:40.807 に答える
0

アニメーションを使用する必要があります。以下は、上下にスライドするアニメーションに使用されるコードです

 btn.setOnClickListener(new OnClickListener()
        {

            public void onClick(View arg0) {


                isOpen=!isOpen;
                if(isOpen)
                { //
                    lin1.getLayoutParams().height=actualHeight;
                        btn.setBackgroundResource(R.drawable.header_uparrow);

                }
                else
                    btn.setBackgroundResource(R.drawable.header_downarrow);
                ani a=new ani();
                a.setDuration(2000);

        lin1.startAnimation(a);
                }

            //}

        }); 
class ani extends Animation
    {


        public ani()
        {

        }
          @Override
          protected void applyTransformation(float interpolatedTime, Transformation t) {
              int newHeight;
              if(isOpen)
              newHeight = (int)(initialHeight * interpolatedTime);
              else
                  newHeight = (int)(initialHeight * (1-interpolatedTime));

              lin1.getLayoutParams().height = newHeight;
              lin1.requestLayout();

          }

          @Override
          public void initialize(int width, int height, int parentWidth, int parentHeight) {
              super.initialize(width, height, parentWidth, parentHeight);

              initialHeight = actualHeight;


          }

          @Override
          public boolean willChangeBounds() {
              return true;
          }
      };
于 2011-10-29T09:26:45.273 に答える