代码之家  ›  专栏  ›  技术社区  ›  Phil

设置TextView高度增加的动画

  •  0
  • Phil  · 技术社区  · 9 年前

    请有人发布一个简单的示例,说明如何将高度从0dp增长到动态值的TextView动画化?

    我想增加文本视图的高度,但允许用户像动画一样查看它。唯一的条件是我知道我的最大身高是可变的,在运行时不知道。我想允许的最大值是100dp。

    我尝试过执行一个简单的for循环,例如:

    runOnUiThread(new Runnable() {
        public void run() {
            LayoutParams params = myTextView.getLayoutParams();
            int myMaxHeightValue = 100;
            for (int x=0; x<myMaxHeightValue; x++) {
                params.height = getDensityPixels(x);
                myTextView.setLayoutParams(params);
                Thread.Sleep(300);
            }
        }
    });
    
    public void getDensityPixels(int value) {
        float density = getResources().getDisplayMetrics.display;
        return (int) (value * density + 0.5f);
    }
    

    有人能提供一个简单的例子,让我提供最大高度,并观察文本视图从0dp高度增长到最大dp高度吗?当我使用上面的代码时,它确实会增加到100dp的最大高度,但屏幕在调整大小时会锁定,而不是在增加时显示给我。

    非常感谢您的帮助!

    2 回复  |  直到 9 年前
        1
  •  2
  •   Sreejith B Naick    9 年前

    切勿使用线程执行UI/视图动画。Android提供了很多动画选项,比如 ObjectAnimator, ValueAnimator, View Animator

    例如,根据您的要求。

        private void animateHeight() {
            TextView myTextView=null;
            int maxInDp = 100;
            int maxInPx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                    maxInDp, mLauncher.getResources().getDisplayMetrics());
            ObjectAnimator.ofInt(this, "btnHeight", maxInPx).setDuration(300).start(); // for better animation change duration , and set interpolator.
        }
    
        public int btnHeight = 0;
    
        public int getBtnHeight() {
            return btnHeight;
        }
    
        public void setBtnHeight(int height) {
            btnHeight = height;
            LayoutParams params = myTextView.getLayoutParams();
            params.height = btnHeight;
            myTextView.setLayoutParams(params);
        }
    
        2
  •  1
  •   Marcus    9 年前

    您正在通过在主线程上运行工作线程来锁定主线程。若要在后台工作时更新UI,请使用AsyncTask。 This tutorial 解释了如何做得很好。

    基本上,AsyncTask看起来像这样(上面教程中的示例)

    public class DoSomethingTask extends AsyncTask<Void, String, Void> {
    
      private static final String TAG = "DoSomethingTask";
      private static final int DELAY = 5000; // 5 seconds
      private static final int RANDOM_MULTIPLIER = 10;
    
      @Override
      protected void onPreExecute() {
       Log.v(TAG, "starting the Random Number Task");
       super.onPreExecute();
      }
    
      @Override
      protected void onProgressUpdate(String... values) {
    
      //HERE is where you will be doing your UI updates
    
       Log.v(TAG, "reporting back from the Random Number Task");
       updateResults(values[0].toString());
       super.onProgressUpdate(values);
      }
    
      @Override
      protected Void doInBackground(Void... params) {
    
      //HERE is where you will be doing your work (your loop)
    
       Log.v(TAG, "doing work in Random Number Task");
       String text="";
       while (true) {
        if (isCancelled()) {
         break;
        }
        int randNum = (int) (Math.random() * RANDOM_MULTIPLIER);
        text = String.format(getString(R.string.service_msg), randNum);
    
        //This is how you tell your thread to update the UI
        publishProgress(text);
    
        try {
         Thread.sleep(DELAY);
        } catch (InterruptedException e) {
         Log.v(TAG, "Interrupting the Random Number Task");
        }
       }
       return null;
      }
    }