J'utilise objectAnimator pour animer un bouton de bas en haut dans Android. Maintenant j'utilise le code ci-dessous
ObjectAnimator transAnimation = ObjectAnimator.ofFloat(button,"translationY",0,440);
transAnimation.setDuration(440);
transAnimation.start();
J'ai également essayé avec l'exemple de code ci-dessous. Mais le problème existe toujours
ObjectAnimator transAnimation = ObjectAnimator.ofFloat(loginLayout, "translationY",0f,0.8f);
transAnimation.setDuration(480);
transAnimation.start();
Cela fonctionne bien dans les appareils à grand écran. Mais quand il s'agit de petits appareils à écran, il disparaît de l'écran. Je veux le garder en haut de l'écran, indépendamment des différentes tailles d'écran. Je pense que je dois donner des valeurs en pourcentage (disons 0% à 100% ou 0 à 100% p). Ma question est donc de savoir comment donner des valeurs en pourcentage dans objectAnimator dans Android. J'ai également remarqué une chose que cet objetAnimator n'est introduit que dans HoneyComb. Il existe donc des bibliothèques de compatibilité descendante pour l'exécuter dans les versions basses. Quelqu'un pourrait-il me guider pour trouver une solution à cela.
J'ai également essayé d'étendre View et d'écrire getter et setter pour la propriété dans offset()
. Pourtant, il ne se déplace pas complètement en haut de l'écran. Voici le code que j'ai utilisé.
@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);
}
Merci d'avance
Pour utiliser ObjectAnimator
sur les appareils pré-Honeycomb, ajoutez NineOldAndroids à votre projet et modifiez vos importations pour utiliser com.nineoldandroids.animation.ObjectAnimator
.
Pour utiliser des valeurs de pourcentage dans ObjectAnimator
au lieu de getXFraction
et setXFraction
, vous devez ajouter getYFraction
et setYFraction
des méthodes comme celle-ci
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);
}
Et puis vous pouvez créer un fichier xml project-folder/res/animator/move_bottom.xml
comme ça
<?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" />
Ou créez une animation dans le code
final LoginLayout loginLayout = (LoginLayout) findViewById(R.id.login_layout);
final ObjectAnimator oa = ObjectAnimator.ofFloat(loginLayout, "yFraction", 0f, 0.8f);
oa.start();
Essayez d'utiliser une propriété personnalisée pour ObjectAnimator, au lieu de créer une vue personnalisée avec une propriété personnalisée, vous pouvez créer une propriété personnalisée qui accepte une "fraction":
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);
Si vous souhaitez créer une animation depuis l'extérieur de l'écran avec ObjectAnimator. Vous pouvez le faire avec Android taille d'affichage.
@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);
}
Désolé, si ma suggestion a manqué le point.
J'ai fait comme ça, j'ai passé trop de temps mais ça vous fera gagner du temps.
Arguments:
N'ayez pas peur avec Arguments, j'explique ici par exemple.
XML et Java code:
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;
sur 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();
}
});
Méthode:
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();
}
Comment appeler Méthode:
animateViewByPercentageOrProgrss(viewSuppot, parentWidth, childWidth, percentage);
C'est fait.