可绘制围绕Android的中心旋转

我得到奇怪的结果与下面的代码:

iv = (ImageView) findViewById(R.id.iv); iv.setImageResource(R.drawable.spinner_white_76); Animation a = new RotateAnimation(0.0f, 360.0f, Animation.RELATIVE_TO_SELF, iv.getDrawable() .getIntrinsicWidth() / 2, Animation.RELATIVE_TO_SELF, iv.getDrawable().getIntrinsicHeight() / 2); a.setRepeatCount(-1); a.setDuration(1000); iv.startAnimation(a); 

什么是正确的方法来指定轴点(drawable的中心)?

  • 在xml选择器中更改drawable的色调
  • android:在textView中适合DrawableLeft的高度
  • 9-Patch可绘制尺寸Android。 不同密度如何处理未拉伸区域?
  • Drawable =>灰度
  • Android:了解drawable文件夹
  • 使用可绘制的资源
  • 中心颜色可以重新定位在一个android径向渐变可绘制?
  • Glide:加载drawable但不扩展占位符
  • 感觉愚蠢! 花了一些时间仔细阅读文档后,

     Animation a = new RotateAnimation(0.0f, 360.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); a.setRepeatCount(-1); a.setDuration(1000); 

    请注意,如果您的对象具有不对称的填充(例如,左边距为5px,右边距为0px),则这不起作用,因为填充被视为对象的一部分。 这意味着计算中心将被抵消。

    对此的一个解决scheme是使用边距而不是填充,如果您使用填充为布局的原因。 正如API在利润率方面所言:“这个空间超出了这个观点的范围。” ( ViewGroup.MarginLayoutParams )

    这意味着边距不会像填充一样旋转。

    作为这个问题的标题是可绘制的围绕它的中心旋转(我正在寻找它,没有find它,并必须自己实现)想张贴我的解决scheme/答案。

    我最终写了自定义drawable可以包装任何drawable,并允许其旋转。 这里是代码:

     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; } }