Android自定义控件+动画(2)-水波纹效果

作者: 任珉豪 | 来源:发表于2017-08-13 16:06 被阅读193次

需求

设计师让制作个水波纹效果的加载界面

效果图

2017-08-13 16_04_47.gif

代码实现分析

1\使用自定义控件继承textview

2\艺术字体需要设计师提供ttf文件

3\水波纹效果需要设计师提供一个半透明度的水波纹图片

4\把这个水波纹图片不断在自定义的textview上移动并绘制

具体代码如下:

  public class LoadingView extends TextView {

private BitmapShader bitmapShader;
private int shadeX;
private int shadeY;
private Matrix matrix;
private int intrinsicHeight;
private int h;

public LoadingView(Context context) {
    this(context, null);
}

public LoadingView(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs, 0);
}

public LoadingView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initView();
}

private void initView() {
    //设置字体颜色
    this.setTextColor(Color.RED);
    //设置为美术字体:美工会提供相应的ttf文件 并放入assets目录下面
    Typeface fromAsset = Typeface.createFromAsset(getResources().getAssets(), "Satisfy-Regular.ttf");
    setTypeface(fromAsset);
    //初始化一个矩阵,用于让着色器不断的向下和向右移动
    matrix = new Matrix();

}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    //获取当前控件的高度
    this.h = h;
    //把图片画到bitmap里面
    Drawable wave = getResources().getDrawable(R.drawable.wave);
    int intrinsicWidth = wave.getIntrinsicWidth(); // 图片的原始宽度
    intrinsicHeight = wave.getIntrinsicHeight();
    Bitmap bitmap = Bitmap.createBitmap(intrinsicWidth, intrinsicHeight, Bitmap.Config.ARGB_8888);
    //画布和bitmap进行绑定
    Canvas canvas = new Canvas(bitmap);
    canvas.drawColor(getCurrentTextColor());
    //把Drawable绘制出来必须要设置边界
    wave.setBounds(0,0,intrinsicWidth, intrinsicHeight);
    wave.draw(canvas);
    //准备一个着色器,把图片绘制到自定义控件上
    bitmapShader = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.CLAMP);
    getPaint().setShader(bitmapShader);
    //把着色器进行平移 为了使着色器和loading进行覆盖
    shadeX = 0;
    shadeY = -intrinsicHeight / 2;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    shadeX += 3;
    shadeY += 0.3;
    if (shadeY > -intrinsicHeight / 2 + h) {
        shadeY = -intrinsicHeight / 2;
    }
    matrix.setTranslate(shadeX,shadeY);
    bitmapShader.setLocalMatrix(matrix);
    invalidate();
}

}

知识点总结

自定义View中的 "shader" 使用技巧

如何给textview设置自定义字体

Android自定义控件+动画(1)-炫彩wifi信号

相关文章

网友评论

    本文标题:Android自定义控件+动画(2)-水波纹效果

    本文链接:https://www.haomeiwen.com/subject/enherxtx.html