Android Drawable实现自定义动画

1.xml如何自定义圆角 shapeDrawable?环形?三角形?

2.drawable有多少种?用法是什么?

上面的都不说,只说一个关于Drawable不常用到的用法

-----------------------------------------------------我是分割线--------------------------------------------------------

半屏动画实际效果如下图:


第一个想法你想用什么来实现?在view 的 onDraw中实现?这也许是很多人的第一个想法,我也是,

但想起之前在github上翻看某大神源码时看到用自定义Drawable + 动画器插值实现了一个太阳冉冉升起的动画,就想采用类似的做法来做,

具体思路如下:

1.gif图片中的弧形动画以及阻尼动画,说白了也就是canvas绘制圆弧等的组合,即根据时间变化计算绘制相应图形即可

2.Drawable中有draw(Canvas canvas)方法,在此方法中可通过canvas进行绘制,

3.View实现TranslationAnimation,可实现整体的上移或者下移,同时创建时间插值

4.把View动画创建的时间插值动态传递给Drawable,Drawable根据时间插值,动态计算并绘制图形

好处:

1.使用Drawable而不是在View中来绘制,不会影响到之前View中onDraw的代码和逻辑

2.Drawable一般当做背景,与view耦合很小

3.Animation产生插值,可设置不同加速器 产生不同效果

可见,我们所有需要的前置条件都已经满足了,现在开始 实现

1.创建TranslationAnimation产生时间插值,如下图interpolatedTime

        final AnimationSet as = new AnimationSet(true);
        as.setDuration(600);
        TranslateAnimation translateAnimation = new TranslateAnimation(
                ScaleAnimation.RELATIVE_TO_SELF,0,
                ScaleAnimation.RELATIVE_TO_SELF,0,
                ScaleAnimation.RELATIVE_TO_SELF,1.0f,
                ScaleAnimation.RELATIVE_TO_SELF,0){
            @Override
            protected void applyTransformation(float interpolatedTime, Transformation t) {
                super.applyTransformation(interpolatedTime, t);
                myDrawable.setPercent(interpolatedTime, true);
            }
        };
        as.addAnimation(translateAnimation);
        return as;

2.自定义Drawable及讲解

public class MyAnimationDrawable3 extends Drawable implements Drawable.Callback {
    private Paint mPaint;
    private int mWidth;
    private int mHeight;

    public MyAnimationDrawable3(int width,int height) {
        mPaint = new Paint();
        mWidth = width;
        mHeight = height;
    }

    @Override
    public void draw(Canvas canvas) {
        // 主要绘制代码
//        canvas.drawRoundRect(rectF, 30, 30, mPaint);
    }

    @Override
    public int getIntrinsicWidth() {
        return mWidth;
    }

    @Override
    public int getIntrinsicHeight() {
        return mHeight;
    }

    @Override
    public void setAlpha(int alpha) {
        mPaint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(ColorFilter cf) {
        mPaint.setColorFilter(cf);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }

    @Override
    public void invalidateDrawable(Drawable who) {
        final Callback callback = getCallback();
        if (callback != null) {
            callback.invalidateDrawable(this);
        }
    }

    @Override
    public void scheduleDrawable(Drawable who, Runnable what, long when) {
        final Callback callback = getCallback();
        if (callback != null) {
            callback.scheduleDrawable(this, what, when);
        }
    }

    @Override
    public void unscheduleDrawable(Drawable who, Runnable what) {
        final Callback callback = getCallback();
        if (callback != null) {
            callback.unscheduleDrawable(this, what);
        }
    }
}


其中draw中负责具体绘制,getIntrinsicWidth,getIntrinsicHeight为指定宽高,setAlpha,setColorFilter等都很简单,最后,该类实现Drawable.CallBack,实现最后三个方法,作用是“把你实现的该接口注册到动画Drawable上可以实现动态Drawable的调度和执行”

3.传递时间插值进入Drawable

    /**
     * @param percent 时间插值
     */
    public void setPrecent(float percent){
        if (percent > 0.5f){
            //逻辑代码,计算弧度等
        }else{
            //逻辑代码,计算弧度等
        }
        // 刷新 draw 图形
        invalidateSelf();
    }
传递进去时间插值后,即可根据时间插值计算相关弧度,在draw中进行绘制即可完成动态图中的效果(绘制逻辑 就不说了,大概为插值0-1绘制向上半圆弧,到顶点根据阻尼振动函数绘制半径变化的圆弧)




未完待续...


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一些Android Java Toast自定义动画的代码,以下是示例代码: 1. 在res目录下新建anim文件夹(如果没有的话),并在该文件夹下新建一个xml文件,例如:toast_slide_in.xml,其内容如下: ``` <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="500" android:fromXDelta="100%" android:toXDelta="0%" /> </set> ``` 2. 然后在res/drawable目录下创建背景文件,例如:toast_custom_bg.xml,其内容如下: ``` <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="50dp" /> <solid android:color="#FF4081" /> <padding android:bottom="10dp" android:left="12dp" android:right="12dp" android:top="10dp" /> </shape> ``` 3. 然后在Java代码中创建一个自定义的Toast,代码如下: ``` public class CustomToast { public static void show(Context context, String message) { LayoutInflater inflater = LayoutInflater.from(context); View layout = inflater.inflate(R.layout.toast_layout, null, false); TextView text = layout.findViewById(R.id.toast_text); ImageView icon = layout.findViewById(R.id.toast_icon); //设置文本和图标 text.setText(message); icon.setImageResource(R.drawable.ic_launcher); Toast toast = new Toast(context); toast.setGravity(Gravity.BOTTOM, 0, 100); toast.setView(layout); toast.setDuration(Toast.LENGTH_LONG); //设置动画 Animation slideIn = AnimationUtils.loadAnimation(context, R.anim.toast_slide_in); toast.getView().startAnimation(slideIn); toast.show(); } } ``` 4. 最后,调用CustomToast.show()方法即可展示自定义的Toast,如下所示: ``` CustomToast.show(this, "这是一条自定义的Toast"); ``` 以上是示例代码,您可以根据需要修改和调整。希望能对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值