Ich habe derzeit eine benutzerdefinierte Ansicht mit einer Drawable-Ressource, die ich animieren möchte, sie von einer Position zu einer anderen zu bewegen. Ich weiß, dass es zwei Möglichkeiten gibt, PropertyAnimation
zu implementieren, Sie können es tun, indem Sie ValueAnimation
oder ObjectAnimation
verwenden. Aber mit beiden habe ich keine Informationen in Google Docs gefunden, wie man sie mit Drawable statt View verwendet. This ist das einzige Beispiel, das ich zu meinem Problem, dass ist ähnlich gefunden, und so habe ich tryed es in meinem Code zu implementieren:Wie animiert man eine Drawable in einer benutzerdefinierten Ansicht?
MainActivity
public class MainActivity extends AppCompatActivity {
private Button animate;
private CustomView mView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mView = new CustomView(MainActivity.this);
animate = (Button) findViewById(R.id.animate);
animate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mView.startAnimation();
}
});
}
}
Custom
public class CustomView extends View {
private Drawable drawable;
private Rect drawableRect;
private int newPos;
public CustomView(Context context) {
super(context);
drawable = ContextCompat.getDrawable(context, R.drawable.my_drawable);
drawableRect= new Rect();
newPos = 0;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
...
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawableRect.left = 0;
drawableRect.top = newPos;
drawableRect.right = drawable.getIntrinsicWidth();
drawableRect.bottom = newPos + drawable.getIntrinsicHeight();
drawable.setBounds(drawableRect);
drawable.draw(canvas);
}
public void startAnimation() {
ValueAnimator animator = ValueAnimator.ofFloat(0, 200);
animator.setDuration(1500);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
newPos = ((Float) valueAnimator.getAnimatedValue()).intValue();
CustomView.this.invalidate();
}
});
animator.start();
invalidate();
}
}
Aber ohne Wirkung. Der Wert von newPos
ändert sich ordnungsgemäß (mit Logs überprüft) und der Bildschirm wird aktualisiert (mit Oberflächenaktualisierung überprüft), aber Drawable wird nicht verschoben. Was mache ich falsch? Ich hoffe auf jede Hilfe.
Haben Sie überprüft, dass 'newPos' für etwas anderes von 0 ändern? Fügen Sie einige Protokolle oder Unterbrechungspunkte hinzu und versuchen Sie es erneut, wenn Sie dies nicht getan haben. – Eselfar