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 回答