Как указать процентные значения в ObjectAnimator в Android
Я использую objectAnimator для анимации кнопки снизу вверх в Android. Теперь я использую код ниже
ObjectAnimator transAnimation = ObjectAnimator.ofFloat(button,"translationY",0,440);
transAnimation.setDuration(440);
transAnimation.start();
Я также пробовал с примером кода ниже. Но проблема существует
ObjectAnimator transAnimation = ObjectAnimator.ofFloat(loginLayout, "translationY",0f,0.8f);
transAnimation.setDuration(480);
transAnimation.start();
Он отлично работает в устройствах с большим экраном. Но когда дело доходит до устройств с небольшим экраном, он отключается от экрана. Я хочу оставить его в верхней части экрана независимо от разных размеров экрана. Я думаю, что я должен давать значения в процентах (например, от 0% до 100% или от 0 до 100% р). Поэтому мой вопрос заключается в том, как давать значения в процентах в объектеAnimator в Android. Я также заметил, что этот объектAnimator вводится только в HoneyComb. Итак, есть ли библиотеки с обратной совместимостью для запуска в низких версиях. Может ли кто-нибудь помочь мне найти решение для этого.
Я также пробовал расширять View и записывать getter и setter для свойства в offset()
. Тем не менее он не перемещается полностью в верхнюю часть экрана. Вот код, который я использовал.
@SuppressLint("NewApi") public float getXFraction()
{
int width = context.getWindowManager().getDefaultDisplay().getHeight();
return (width == 0) ? 0 : (getY());
}
@SuppressLint("NewApi") public void setXFraction(float xFraction) {
int width = context.getWindowManager().getDefaultDisplay().getWidth();
setY((width > 0) ? (width) : 0);
}
Спасибо inAdvance
Ответы
Ответ 1
Чтобы использовать ObjectAnimator
на устройствах с предварительной записью, добавьте в проект проект NineOldAndroids и измените импорт, чтобы использовать com.nineoldandroids.animation.ObjectAnimator
.
Чтобы использовать процентные значения в ObjectAnimator
вместо getXFraction
и setXFraction
, вам нужно добавить методы getYFraction
и setYFraction
, подобные этому
public float getYFraction() {
final WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
int height = wm.getDefaultDisplay().getHeight();
return (height == 0) ? 0 : getY() / (float) height;
}
public void setYFraction(float yFraction) {
final WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
int height = wm.getDefaultDisplay().getHeight();
setY((height > 0) ? (yFraction * height) : 0);
}
И затем вы можете создать xml файл project-folder/res/animator/move_bottom.xml
, как этот
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:propertyName="yFraction"
android:valueFrom="0"
android:valueTo="0.8"
android:valueType="floatType" />
Или создайте анимацию в коде
final LoginLayout loginLayout = (LoginLayout) findViewById(R.id.login_layout);
final ObjectAnimator oa = ObjectAnimator.ofFloat(loginLayout, "yFraction", 0f, 0.8f);
oa.start();
Ответ 2
Если вы хотите создать анимацию вне экрана с помощью ObjectAnimator. Вы можете сделать это с размером экрана Android.
@Override
public void onCreate(Bundle savedInstanceState) {
...
sampleImage = BitmapFactory.decodeResource(getResources(), R.drawable.sample);
myImage = (ImageView) findViewById(R.id.image_view);
myImage.setImageBitmap(sampleImage);
//In case API Level is 14 above.
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
float displayWidth = size.x;
//In case API Level is 13 below.
//WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
//Display display = wm.getDefaultDisplay();
//displayWidth = display.getWidth();
animator = ObjectAnimator.ofFloat(myImage, "translationX", displayWidth, 0);
animator.setDuration(500);
}
Извините, если мое предложение пропустило точку.
Ответ 3
Попробуйте использовать настраиваемое свойство для ObjectAnimator, вместо создания настраиваемого представления с настраиваемым свойством вы можете создать настраиваемое свойство, которое принимает "фракцию":
Property<View, Float> property = new Property<View, Float>(Float.TYPE, "translation_x_fraction") {
@Override public Float get(View view) {
return view.getWidth() <= 0 ? 0 : view.getTranslationX() / view.getWidth();
}
@Override public void set(View view, Float value) {
view.setTranslationX(view.getWidth() * value);
}
}
ObjectAnimator.ofFloat(view, property, 0f, 1f);
Ответ 4
Я сделал это, я потратил слишком много времени, но это сэкономит ваше время.
Аргументы:
- Просмотр (вид вашей поддержки)
- Ширина родителя (корень вашего вида)
- Ширина для детей (на которую вы хотите применить анимацию)
- % (сколько процентов вы хотите переместить свой объект или просмотр)
Не бойтесь с аргументами, я объясняю здесь пример.
XML и код JAVA:
activity_main.xml
<LinearLayout
android:id="@+id/llProgressParent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:layout_gravity="center"
android:orientation="horizontal"
android:weightSum="1" >
<View
android:id="@+id/viewSuppot"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0" >
</View>
<ImageView
android:id="@+id/ivProgressChild"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/ic_launcher" />
</LinearLayout>
MainActivity.java
private LinearLayout llProgressParent;
private View viewSuppot;
private ImageView ivProgressChild;
private int childWidth, parentWidth;
private int percentage = 75;
on onCreate():
viewSuppot = findViewById(R.id.viewSuppot);
llProgressParent = (LinearLayout)findViewById(R.id.llProgressParent);
llProgressParent.post(new Runnable() {
@Override
public void run() {
parentWidth = llProgressParent.getMeasuredWidth();
}
});
ivProgressChild = (ImageView)findViewById(R.id.ivProgressChild);
ivProgressChild.post(new Runnable() {
@Override
public void run() {
childWidth = ivProgressChild.getMeasuredWidth();
}
});
Метод:
private void animateViewByPercentageOrProgrss(final View view, int parentWidth, int childWidth, int percentage){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ValueAnimator anim = ValueAnimator.ofInt(view.getMeasuredWidth(), (int) (((float) percentage * parentWidth) / 100)-(childWidth/2));
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int val = (Integer) valueAnimator.getAnimatedValue();
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
layoutParams.width = val;
view.setLayoutParams(layoutParams);
}
});
anim.setDuration(2000);
anim.start();
}
Как вызвать Метод:
animateViewByPercentageOrProgrss(viewSuppot, parentWidth, childWidth, percentage);
Выполнено.