2016-03-08 2 views
12
Android Studio 2.0 beta 6 

Я пытаюсь использовать ViewPropertyAnimator для перемещения ImageView (ivSettings) внутри панели инструментов, так что 20dp с правой стороны и 20dp сверху, от это текущее местоположение. И переместите ImageView (ivSearch) 20dp слева и сверху.Получить ширину родительского макета

Образ изображения содержится в файле Toolbar.

Это начальное состояние, и я хочу переместить значки в верхние углы внутри панели инструментов.

enter image description here

код я использую это, чтобы получить ширину, а затем вычесть значение, чтобы получить ivSettings быть 20dp справа.

final DisplayMetrics displayMetrics = new DisplayMetrics(); 
getActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 
final float widthPx = displayMetrics.widthPixels; 

ivSearch.animate() 
    .setInterpolator(new AccelerateInterpolator()) 
    .x(20) 
    .y(20) 
    .setDuration(250) 
    .start(); 

ivSettings.animate() 
    .setInterpolator(new AccelerateInterpolator()) 
    .x(widthPx - 160) 
    .y(20) 
    .setDuration(250) 
    .start(); 

Однако, попробовав это на разных размерах экрана, я не могу получить точный расчет ширины. Есть ли лучший способ сделать это?

Большое спасибо за любые предложения

+0

Попробуйте использовать ширину вместо панели инструментов. – Piyush

+0

Я установил ширину в «match_parent», поэтому toolbar.getWidth() всегда будет возвращать 0. – ant2009

+0

Вы конвертируете dp в пиксель или используете widthPx - 160 выражение для вычисления ширины на каждом устройстве? – Piyush

ответ

7

Вы должны иметь возможность использовать свойства translationX и translationY, чтобы достичь желаемого эффекта. Эти свойства действуют как смещения от исходных координат X и Y представления.

По существу перевод X вытеснит a Вид вправо для положительного значения и выйдет за отрицательное значение из его координаты X. Аналогично, сдвиг Y смещает вид в сторону снизу для положительного и верхнего для отрицательных значений из его координаты Y.

На ваш вопрос, я предполагаю, что конечная позиция, которую вы хотите достичь, - это верхний левый угол для значка поиска, а в правом верхнем углу - значок настроек с нулевым заполнением для каждого вида.

Для значка поиска Я предлагаю вам начать с размещения его в верхнем левом углу панели инструментов. Затем установите и переводX, и переводY в 20p. Это должно помещать значок поиска в то же место, что и ваше изображение. Чтобы переместить значок поиска в верхнем левом углу всего, вам нужно сделать анимационный переводX & Y от 20dp до 0 dp.

Повторите то же самое для значка настроек, но установите translationX на -20dp и переводY на 20dp. Таким образом, он будет размещен в том же положении, что и ваш образ. Анимируйте оба значения до 0 для достижения желаемой анимации.

Вот код анимации для справки.

ivSearch.animate() 
    .setInterpolator(new AccelerateInterpolator()) 
    .translationX(0) // Takes value in pixels. From 20dp to 0dp 
    .translationY(0) // Takes value in pixels. From 20dp to 0dp 
    .setDuration(250) 
    .start(); 

ivSettings.animate() 
    .setInterpolator(new AccelerateInterpolator()) 
    .translationX(0) // Takes value in pixels. From -20dp to 0dp 
    .translationY(0) // Takes value in pixels. From 20dp to 0dp 
    .setDuration(250) 
    .start(); 

// To get pixels from dp 
float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics()); 

Главное в этом подходе состоит в том, что вам больше не нужно знать размеры родителя. Все, что вам нужно, это смещения, которые вы указали через translationX и translationY.

5

Я считаю, что проблема заключается в том, что методы аниматор ожидают значения быть в исходных значений пикселей. Похоже, код будет работать только так, как вы намереваетесь на экране средней плотности. Например. Экран hdpi потребует 30px вместо 20px для размещения в том же месте. На экранах с более высокой плотностью код, существующий, будет приближать значки ближе к краям ...

Это означает, что нам нужно перевести ожидаемое значение dp в значения исходного пикселя и использовать их для анимации. Существует удобный способ преобразования dp в px так, чтобы он был правильным на каждом устройстве. Я предполагаю, что вы хотите, чтобы левая часть шестерки была на 160dp справа (обратите внимание, что я специально говорю левую сторону шестерни, потому что значение 160dp также должно включать в себя ширину изображения шестерни, поскольку свойство x слева от изображения). Таким образом, 160dp = ширина изображения шестерни + желаемое расстояние от правого края. Скажите, что у вас есть ресурс ic_gear: Drawable drawable = getResources(). GetDrawable (R.drawable.ic_gear); float bitmapWidth = getIntrinsicWidth();

float rawPX20DPValue = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics()); 

float rawPXLeftOffset = rawPX20DPValue + bitmapWidth; 

ivSearch.animate() 
    .setInterpolator(new AccelerateInterpolator()) 
    .x(rawPX20DPValue) 
    .y(rawPX20DPValue) 
    .setDuration(250) 
    .start(); 


ivSettings.animate() 
    .setInterpolator(new AccelerateInterpolator()) 
    .x(widthPx - rawPXLeftOffset) 
    .y(rawPX20DPValue) 
    .setDuration(250) 
    .start(); 

Также проверьте на сдвигах (отступов) зубчатого колеса и значок поиска перед переездом, как, скорее всего, повлияет на конечный результат, а также.

+0

Значение 160 было чем-то, с чем я просто играл. То, что я пытаюсь сделать, - это оживить оба изображения, так что один из левых будет 20dp слева от панели инструментов, а один из правых будет 20dp справа от панели инструментов. Для одного из правых, то, что я пытался сделать, это вычислить общую ширину панели инструментов, а затем вычесть значение, чтобы сделать его равным 20dp с правого края. Надеюсь, теперь вы понимаете больше. Благодарю. – ant2009

+0

@ ant2009 Я обновил его, чтобы дать вам расчет размера изображения. Обратите внимание, что если у вас есть дополнение к ImageView, вам нужно будет добавить его и в расчет. Дайте мне знать, если вам нужна дополнительная помощь :) –

Смежные вопросы