背景
我一直在很多地方进行搜索,以查找如何为可绘制对象设置动画,而不对视图进行动画处理以及不使用内置可绘制对象.
原因是我将需要在可绘制对象中准备自定义动画,以后可能会有不同的要求.
现在,我正在制作一个基本的动画可绘制对象,该对象只在其中旋转给定的位图.
我已经在imageVIEw上设置了它,但是我希望能够在任何类型的视图上使用它,甚至是覆盖了onDraw函数的自定义视图.
问题
无论视图的大小如何,我都无法找到如何在不剪切的情况下显示可绘制对象的方法.这是我看到的:
编码
这是代码:
private class CircularAnimatedDrawable extends Drawable implements Animatable { private static final Interpolator ANGLE_INTERPolATOR = new linearInterpolator(); private static final int ANGLE_ANIMATOR_DURATION = 2000; private final RectF fBounds = new RectF(); private float angle = 0; private ObjectAnimator mObjectAnimatorAngle; private final Paint mPaint; private boolean mRunning; private final Bitmap mBitmap; public CircularAnimatedDrawable(final Bitmap bitmap) { this.mBitmap = bitmap; mPaint = new Paint(); setupAnimations(); } public float getAngle() { return this.angle; } public voID setAngle(final float angle) { this.angle = angle; invalIDateSelf(); } @OverrIDe public Callback getCallback() { return mCallback; } @OverrIDe public voID draw(final Canvas canvas) { canvas.save(); canvas.rotate(angle); canvas.drawBitmap(mBitmap, 0, 0, mPaint); canvas.restore(); } @OverrIDe public voID setAlpha(final int Alpha) { mPaint.setAlpha(Alpha); } @OverrIDe public voID setcolorFilter(final colorFilter cf) { mPaint.setcolorFilter(cf); } @OverrIDe public int getopacity() { return PixelFormat.transparent; } @OverrIDe protected voID onBoundsChange(final Rect bounds) { super.onBoundsChange(bounds); fBounds.left = bounds.left; fBounds.right = bounds.right; fBounds.top = bounds.top; fBounds.bottom = bounds.bottom; } private voID setupAnimations() { mObjectAnimatorAngle = ObjectAnimator.offloat(this, "angle", 360f); mObjectAnimatorAngle.setInterpolator(ANGLE_INTERPolATOR); mObjectAnimatorAngle.setDuration(ANGLE_ANIMATOR_DURATION); mObjectAnimatorAngle.setRepeatMode(ValueAnimator.RESTART); mObjectAnimatorAngle.setRepeatCount(ValueAnimator.INFINITE); } @OverrIDe public voID start() { if (isRunning()) return; mRunning = true; mObjectAnimatorAngle.start(); invalIDateSelf(); } @OverrIDe public voID stop() { if (!isRunning()) return; mRunning = false; mObjectAnimatorAngle.cancel(); invalIDateSelf(); } @OverrIDe public boolean isRunning() { return mRunning; }}
和用法:
final ImageVIEw imageVIEw = (ImageVIEw) findVIEwByID(R.ID.imageVIEw); final Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.spinner_76_inner_holo); final CircularAnimatedDrawable circularAnimatedDrawable = new CircularAnimatedDrawable(bitmap); circularAnimatedDrawable.setCallback(imageVIEw); circularAnimatedDrawable.start(); imageVIEw.setimageDrawable(circularAnimatedDrawable);
问题
如何设置它以使可绘制对象适合视图?
我应该使用位图大小吗? fBounds?都?也许还有其他东西?
解决方法:
尝试使用此Drawable的修改版本:
class CircularAnimatedDrawable extends Drawable implements Animatable, TimeAnimator.TimeListener { private static final float TURNS_PER_SECOND = 0.5f; private Bitmap mBitmap; private boolean mRunning; private TimeAnimator mTimeAnimator = new TimeAnimator(); private Paint mPaint = new Paint(); private Matrix mMatrix = new Matrix(); public CircularAnimatedDrawable(final Bitmap bitmap) { mBitmap = bitmap; mTimeAnimator.setTimeListener(this); } @OverrIDe public voID draw(final Canvas canvas) { canvas.drawBitmap(mBitmap, mMatrix, mPaint); } @OverrIDe protected voID onBoundsChange(Rect bounds) { Log.d(TAG, "onBoundsChange " + bounds); mMatrix.setRectToRect(new RectF(0, 0, mBitmap.getWIDth(), mBitmap.getHeight()), new RectF(bounds), Matrix.ScaletoFit.CENTER); } @OverrIDe public voID onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime) { Rect b = getBounds(); mMatrix.postRotate(360 * TURNS_PER_SECOND * deltaTime / 1000, b.centerX(), b.centerY()); invalIDateSelf(); } @OverrIDe public voID setAlpha(final int Alpha) { mPaint.setAlpha(Alpha); } @OverrIDe public voID setcolorFilter(final colorFilter cf) { mPaint.setcolorFilter(cf); } @OverrIDe public int getopacity() { return PixelFormat.transparent; } @OverrIDe public voID start() { if (isRunning()) return; mRunning = true; mTimeAnimator.start(); invalIDateSelf(); } @OverrIDe public voID stop() { if (!isRunning()) return; mRunning = false; mTimeAnimator.cancel(); invalIDateSelf(); } @OverrIDe public boolean isRunning() { return mRunning; }}
编辑:没有Animator内容的版本(使用[un] scheduleSelf),请注意它使用VIEw的Drawable.Callback机制,因此通常无法直接从onCreate启动,而VIEw尚未附加处理程序
class CircularAnimatedDrawable extends Drawable implements Animatable, Runnable { private static final float TURNS_PER_SECOND = 0.5f; private static final long DELAY = 50; private Bitmap mBitmap; private long mLastTime; private boolean mRunning; private Paint mPaint = new Paint(); private Matrix mMatrix = new Matrix(); public CircularAnimatedDrawable(final Bitmap bitmap) { mBitmap = bitmap; } @OverrIDe public voID draw(final Canvas canvas) { canvas.drawBitmap(mBitmap, mMatrix, mPaint); } @OverrIDe protected voID onBoundsChange(Rect bounds) { Log.d(TAG, "onBoundsChange " + bounds); mMatrix.setRectToRect(new RectF(0, 0, mBitmap.getWIDth(), mBitmap.getHeight()), new RectF(bounds), Matrix.ScaletoFit.CENTER); } @OverrIDe public voID setAlpha(final int Alpha) { mPaint.setAlpha(Alpha); } @OverrIDe public voID setcolorFilter(final colorFilter cf) { mPaint.setcolorFilter(cf); } @OverrIDe public int getopacity() { return PixelFormat.transparent; } @OverrIDe public voID start() { if (isRunning()) return; mRunning = true; mLastTime = SystemClock.uptimeMillis(); scheduleSelf(this, 0); invalIDateSelf(); } @OverrIDe public voID stop() { if (!isRunning()) return; mRunning = false; unscheduleSelf(this); invalIDateSelf(); } @OverrIDe public boolean isRunning() { return mRunning; } @OverrIDe public voID run() { long Now = SystemClock.uptimeMillis(); Rect b = getBounds(); long deltaTime = Now - mLastTime; mLastTime = Now; mMatrix.postRotate(360 * TURNS_PER_SECOND * deltaTime / 1000, b.centerX(), b.centerY()); scheduleSelf(this, Now + DELAY); invalIDateSelf(); }}
总结 以上是内存溢出为你收集整理的android-如何正确创建自定义的动画可绘制对象?全部内容,希望文章能够帮你解决android-如何正确创建自定义的动画可绘制对象?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)