【问题标题】:Variant from android-autofittextview library : scaling makes strange behaviourandroid-autofittextview 库的变体:缩放会产生奇怪的行为
【发布时间】:2015-06-04 21:58:30
【问题描述】:

所以为了告诉你到底发生了什么,让我先解释一下上下文。

我按照本教程进行操作: https://viksaaskool.wordpress.com/2014/11/16/using-auto-resize-to-fit-edittext-in-android/

这基本上是一个简单的 autoresizeEditText,基于 autoFitTextView 库 (https://github.com/grantland/android-autofittextview)。

我想要实现的:当我点击一个按钮时,整个布局被放大,我模拟点击editText让用户输入一些文字。

到目前为止我所取得的成就:嗯,几乎所有东西,除了它只适用于某些设备,而不适用于其他设备。

仅供参考,这里有两个动画 gif 可以说明我在说什么:

良好行为(Nexus 5 API 21):http://giphy.com/gifs/xTiTnH1hyuJzjnDl6w

不良行为(Nexus 6 API 22):http://giphy.com/gifs/3-1-2-3o85xDB4Wyve1jh0XK

如您所见,缩放很好,然后输入文本也很好,直到在某些情况下,文本不会出现在未缩放的 editText 右侧之后。但是一旦必须更改文本大小(或者我缩小视图),一切都会恢复正常。

所以我的问题是:任何人都会知道是什么导致了这种奇怪的行为? 有人在 autoFitTextView 或它的扩展上遇到过这个问题吗?

提前致谢!

PS:我可以发布一些代码,但是由于提供了两个库+链接并且很长,我不想在这里发布它们,因为它们基本上是相同的。我可以提供的是为视图设置动画和显示键盘的调用(即使我不确定它是否相关):

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mView = inflater.inflate(R.layout.add_message_layout, null);
    mMessageEditText = (AutoResizeEditText) mView.findViewById(R.id.messageEditText);
    mMessageEditText.setEnabled(false);
    mMessageEditText.setEnableSizeCache(false);
    mMessageEditText.setMovementMethod(null);
    mMessageEditText.setInterface(this);
    mMessageEditText.setMinTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, MIN_SP_TEXT_SIZE, getResources().getDisplayMetrics()));
    mMessageEditText.setMaxHeight((int) DisplayUtils.convertDpToPixel(getActivity().getApplicationContext(), mMessageEditText.getMeasuredHeight()));
    mMessageEditText.setLines(MAX_LINES_COUNT);
    mMessageEditText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            mLastMessage = mMessageEditText.getText().toString();
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (mMessageEditText.getLineCount() > MAX_LINES_COUNT) {
                //If user tries to type more text than expected !
                mMessageEditText.setText(mLastMessage);
                mMessageEditText.setSelection(mLastMessage.length());
                Toast.makeText(getActivity().getApplicationContext(), "Limit Reached", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void afterTextChanged(Editable s) {
            mLastMessage = mMessageEditText.getText().toString();
            mMessageEditText.invalidate();
        }
    });

    mAddMessageButton = (RelativeLayout) mView.findViewById(R.id.rlAddMessage);
    mAddMessageButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            setupAnimations();
            animZoomIn();
        }
    });

    mCardLayout = (LinearLayout) mView.findViewById(R.id.rearMainCardLayout);
    return (mView);
}

private void setupAnimations() {
    mPivotX = mMessageEditText.getPivotX() / mCardLayout.getMeasuredHeight();
    mPivotY = mMessageEditText.getPivotY() / mCardLayout.getMeasuredWidth();

    mZoomIn = new ScaleAnimation(1.0f, 1.3f, 1.0f, 1.3f, mPivotX, mPivotY);
    mZoomIn.setDuration(1000);
    mZoomIn.setFillAfter(true);

    mSlideUp = new TranslateAnimation(0.0f, 100.0f, 0.0f, -100.0f);
    mSlideUp.setDuration(1000);
    mSlideUp.setFillAfter(true);

    mEnterAnimation = new AnimationSet(true);
    mEnterAnimation.setInterpolator(new LinearInterpolator());
    mEnterAnimation.addAnimation(mZoomIn);
    mEnterAnimation.addAnimation(mSlideUp);
    mEnterAnimation.setFillAfter(true);
    mEnterAnimation.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {

            mBeginX = mMessageEditText.getLeft();
            mBeginY = mMessageEditText.getTop();
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            mMessageEditText.setPressed(true);      //EditText will get highlighted
            mMessageEditText.setFocusable(true);
            mMessageEditText.setFocusableInTouchMode(true);
            mMessageEditText.setTextIsSelectable(true);
            mMessageEditText.requestFocus();
            mMessageEditText.invalidate();

            mMessageEditText.setEnabled(true);
            showKeyboard(getActivity().getApplicationContext(), mMessageEditText);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {}
    });

    mZoomOut = new ScaleAnimation(1.3f, 1.0f, 1.3f, 1.0f, mPivotX, mPivotY);
    mZoomOut.setDuration(1000);
    mZoomOut.setFillAfter(true);

    mSlideDown = new TranslateAnimation(100.0f, 0.0f, -100.0f, 0.0f);
    mSlideDown.setDuration(1000);
    mSlideDown.setFillAfter(true);

    mExitAnimation = new AnimationSet(true);
    mExitAnimation.setInterpolator(new LinearInterpolator());
    mExitAnimation.addAnimation(mZoomOut);
    mExitAnimation.addAnimation(mSlideDown);
    mExitAnimation.setFillAfter(true);
    mExitAnimation.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {}

        @Override
        public void onAnimationEnd(Animation animation) {
            mMessageEditText.invalidate();
        }

        @Override
        public void onAnimationRepeat(Animation animation) {}
    });
}

private void animZoomIn() {
    mCardLayout.startAnimation(mEnterAnimation);
}

private void animZoomOut() {
    mCardLayout.startAnimation(mExitAnimation);
}

private static void closeKeyboard(Context c, IBinder windowToken) {
    InputMethodManager manager = (InputMethodManager)c.getSystemService(Context.INPUT_METHOD_SERVICE);
    manager.hideSoftInputFromWindow(windowToken, 0);
}

private static void showKeyboard(Context c, EditText text) {
    InputMethodManager manager = (InputMethodManager) c.getSystemService(Context.INPUT_METHOD_SERVICE);
    manager.showSoftInput(text, InputMethodManager.SHOW_IMPLICIT);
}

【问题讨论】:

  • 我不确定我在动画中看到了什么(可能不够流畅?)。但是您是否尝试过其他方式来制作动画?您使用的是 Android 的旧 API(Honeycomb 之前)。尝试使用 "view.animate()...." ,或者如果需要,甚至尝试为布局本身设置动画(例如:stackoverflow.com/a/19616416/878126)。我建议这样做的原因是旧 API 并没有真正改变视图的大小和/或位置,只是改变了它们的外观。
  • 这是我没有意识到@androiddeveloper的一种方法,我明天早上肯定会测试这个,希望这可以解决这个问题。似乎出于某种原因,它实际上改变了某些设备/API 上视图的大小/位置,但在其他设备/API 上却没有。我会尽快通知您,但感谢您的提示!
  • 使用旧的 API 不应该改变视图的大小/位置。您可以制作 POC 以查看此行为:制作一个按钮,单击该按钮将显示 toast。设置一个动画,将它从一个地方移动到另一个地方并让它呆在那里。尝试单击按钮。该按钮在其新位置上不可点击,因为它实际上并不存在。单击原始位置将触发单击事件。如果您尝试使用旧的 API 动画更改其大小,也是如此。
  • @androiddeveloper 您的解决方案非常有效,我使用 animate() 迁移到新的动画系统,在任何设备上都没有任何问题!你介意写一个简短的摘要作为答案,以便我接受吗?顺便说一句,谢谢!

标签: android android-edittext scaleanimation


【解决方案1】:

好的,感谢@android developer指出问题,这是我使用的旧版动画造成的。

所以通过替换

mZoomOut = new ScaleAnimation(1.3f, 1.0f, 1.3f, 1.0f, mPivotX, mPivotY);
mZoomOut.setDuration(1000);
mZoomOut.setFillAfter(true);

mSlideDown = new TranslateAnimation(100.0f, 0.0f, -100.0f, 0.0f);
mSlideDown.setDuration(1000);
mSlideDown.setFillAfter(true);

mExitAnimation = new AnimationSet(true);
mExitAnimation.setInterpolator(new LinearInterpolator());
mExitAnimation.addAnimation(mZoomOut);
mExitAnimation.addAnimation(mSlideDown);
mExitAnimation.setFillAfter(true);
mExitAnimation.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {}

    @Override
    public void onAnimationEnd(Animation animation) {
        mMessageEditText.invalidate();
    }

    @Override
    public void onAnimationRepeat(Animation animation) {}
});
mCardLayout.startAnimation(mEnterAnimation);

新的:

mCardLayout.animate().translationX(0.0f).translationY(0.0f).scaleX(1.0f).scaleY(1.0f).setDuration(1000).withEndAction(new Runnable() {
                @Override
                public void run() {
                    mMessageEditText.invalidate();
                    mIsViewZoomed = false;
                }
            });

解决了所有问题。

【讨论】:

  • 很高兴你成功了。请注意,这只能从某些 API 开始。让它在旧版本的 Android(例如 API 10 及更低版本)上运行将非常具有挑战性。
猜你喜欢
  • 2019-04-13
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多