Tiêu đề cho câu hỏi này là Có thể vẽ Xoay quanh trung tâm (và tôi đang tìm kiếm chính xác, không tìm thấy và phải tự mình thực hiện) muốn đăng giải pháp/câu trả lời của tôi.
Tôi đã kết thúc bằng văn bản có thể vẽ tùy chỉnh có thể quấn bất kỳ hình vẽ nào và cho phép xoay vòng. Đây là mã:
public class RotatableDrawable extends DrawableWrapper {
private float rotation;
private Rect bounds;
private ObjectAnimator animator;
private long defaultAnimationDuration;
public RotatableDrawable(Resources resources, Drawable drawable) {
super(vectorToBitmapDrawableIfNeeded(resources, drawable));
bounds = new Rect();
defaultAnimationDuration = resources.getInteger(android.R.integer.config_mediumAnimTime);
}
@Override
public void draw(Canvas canvas) {
copyBounds(bounds);
canvas.save();
canvas.rotate(rotation, bounds.centerX(), bounds.centerY());
super.draw(canvas);
canvas.restore();
}
public void rotate(float degrees) {
rotate(degrees, defaultAnimationDuration);
}
public void rotate(float degrees, long millis) {
if (null != animator && animator.isStarted()) {
animator.end();
} else if (null == animator) {
animator = ObjectAnimator.ofFloat(this, "rotation", 0, 0);
animator.setInterpolator(new AccelerateDecelerateInterpolator());
}
animator.setFloatValues(rotation, degrees);
animator.setDuration(millis).start();
}
@AnimatorSetter
public void setRotation(float degrees) {
this.rotation = degrees % 360;
invalidateSelf();
}
/**
* Workaround for issues related to vector drawables rotation and scaling:
* https://code.google.com/p/android/issues/detail?id=192413
* https://code.google.com/p/android/issues/detail?id=208453
*/
private static Drawable vectorToBitmapDrawableIfNeeded(Resources resources, Drawable drawable) {
if (drawable instanceof VectorDrawable) {
Bitmap b = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
drawable.setBounds(0, 0, c.getWidth(), c.getHeight());
drawable.draw(c);
drawable = new BitmapDrawable(resources, b);
}
return drawable;
}
}
Thêm "a.setInterpolator (LinearInterpolator mới());" làm cho vòng quay mượt mà hơn một chút. –
Tôi muốn xoay 180 độ nhưng không lặp lại. sau khi xoay, đối tượng sẽ được trên trạng thái cuối cùng những gì tôi có nghĩa là nó sẽ không trở lại ở vị trí bắt đầu. Làm thế nào tôi có thể làm điều đó? –
@Md Omar Faroque Anik: thêm "a.setFillAfter (true);" để thực hiện chuyển đổi liên tục và "a.setRepeatCount (0);" không lặp lại. – Bubu