Я хочу анимировать клавиатуру при добавлении или удалении новой строки, как это делает телеграмма. Я могу добавить анимацию следующим образом:
private void doAnimation(int linesCount, String s){
Toast.makeText(this, "" + linesCount, Toast.LENGTH_SHORT).show();
if (linesCount == 1){
binding.message.getLayoutParams().height = defEditTextHeight;
return;
}
if (linesCount < binding.message.getLineCount()) {
ValueAnimator anim = ValueAnimator.ofInt(binding.message.getHeight(), binding.message.getHeight() + 60)
.setDuration(250);
anim.addUpdateListener(animation -> {
binding.message.getLayoutParams().height = (int) animation.getAnimatedValue();
binding.message.requestLayout();
});
anim.start();
}else if ( linesCount > binding.message.getLineCount()){
ValueAnimator anim = ValueAnimator.ofInt(binding.message.getHeight(), binding.message.getHeight() - 60)
.setDuration(250);
anim.addUpdateListener(animation -> {
binding.message.getLayoutParams().height = (int) animation.getAnimatedValue();
binding.message.requestLayout();
});
anim.start();
}
}
Но, как вы можете видеть, для анимации я добавляю случайное значение, например 60. Но это не надежно для всех устройств.
Итак, как я могу получить высоту каждой строки, чтобы добавить ее и получить хорошую анимацию?
Заранее спасибо ?
@Cheticamp позвольте мне попробовать это. На самом деле метод getHeight()
возвращает 0, а getLayoutParams().height
дает -2. Я попробовал то, что вы сказали. Но это не работает
Если getHeight()
возвращает ноль, вам придется дождаться макета, чтобы получить измерение.
можете предоставить код?
Чтобы дождаться завершения компоновки, взгляните на View.OnLayoutChangeListener или ViewTreeObserver.OnGlobalLayoutListener. Есть пример использования в Интернете.
Спасибо. Было бы здорово, если бы вы могли опубликовать это как ответ. я проверю это
Высота каждой строки Редактировать текст задается StaticLayout, созданным Редактировать текст.
// Get vertical padding of the EditText
int padding = binding.message.getPaddingTop() + binding.message.getPaddingBottom();
// Get the total height of the EditText
int totalHeight = binding.message.getLayout().getHeight() + padding;
// or
int totalHeight = binding.message.getHeight();
// Get the height that line i contributes to the EditText.
int height = binding.message.getLayout().getLineBottom(i) - binding.message.getLayout().getLineTop(i);
Итак, ваши определения анимации будут выглядеть так:
int i = linesCount - 1;
int height = binding.message.getLayout().getLineBottom(i) - binding.message.getLayout().getLineTop(i);
ValueAnimator anim = ValueAnimator.ofInt(binding.message.getHeight(), binding.message.getHeight() + height)
.setDuration(250);
Если вам нужно дождаться макета, вы можете использовать следующее:
binding.message.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
// code here
};
Итак, какой из них предпочтительнее? int totalHeight = binding.message.getLayout().getHeight() + padding;
ИЛИ int totalHeight = binding.message.getHeight();
Я бы предпочел int totalHeight = binding.message.getHeight();
в порядке. позвольте мне попробовать это
когда нужно будет ждать макет? Я не понимаю и что мне делать в //code here
?
Если сумма 60
работает на вас, я бы просто взял binding.message.getLayout().getLineBottom(i) - binding.message.getLayout().getLineTop(i)
в качестве замены. i
будет ссылаться на только что добавленную или только что удаленную строку.
Захват высоты текста при добавлении каждой строки. Затем, когда добавляется или удаляется еще одна строка, разница между текущей высотой и последней высотой представляет собой величину увеличения или уменьшения. Нужно ли что-то более сложное, чем это?