android-如何正确创建自定义的动画可绘制对象?

android-如何正确创建自定义的动画可绘制对象?,第1张

概述背景我一直在很多地方进行搜索,以查找如何为可绘制对象设置动画,而不对视图进行动画处理以及不使用内置可绘制对象.原因是我将需要在可绘制对象中准备自定义动画,以后可能会有不同的要求.现在,我正在制作一个基本的动画可绘制对象,该对象只在其中旋转给定的位图.我已经在imageV

背景

我一直在很多地方进行搜索,以查找如何为可绘制对象设置动画,而不对视图进行动画处理以及不使用内置可绘制对象.

原因是我将需要在可绘制对象中准备自定义动画,以后可能会有不同的要求.

现在,我正在制作一个基本的动画可绘制对象,该对象只在其中旋转给定的位图.

我已经在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-如何正确创建自定义的动画可绘制对象?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1077904.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存