前言

在求学的道路上,有一句跨领域的话就是“教永远是最好的学”!那么自己梦想因此友好的分享能够更好的增援到部分需要的人!
我也可以对友好的缺少举办回顾!

自定义View在android开发中,可以说是一件感觉相比较高级的作业了,这其实自定义view也分为好三种!平时来说我们也给她分为四个层次:

  1. 扩充已有控件
  • 始建复合控件
  • 实现全新的控件

正文

在这边我也为我们准备了一个实例FlashTextView
先看一下效用图
这是不可以的,大家把豪华留到最终!一上来就高潮,这是一种病,得治!

以此效果实在就是由此对TextView举办一个概括的恢弘就可以实现

1.实现

率先我们先创制一个类让它集成TextView

public class FlashTextView extends TextView 

心想事成其构造方法,并在构造方法中起始化大家要用到的目的

public FlashTextView(Context context) {
    super(context);
    init();
}

public FlashTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public FlashTextView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}

   private void init() {
    //初始化用来绘制背景边框的笔
    mPaint1=new Paint();
    mPaint2=new Paint();
    mPaint1.setColor(Color.RED);
    mPaint2.setColor(Color.GRAY);
    mPaint1.setStyle(Paint.Style.FILL);
    mPaint2.setStyle(Paint.Style.FILL);
}

下边是有关闪动效果落实,我们可以运用android中Paint对象的shader渲染器。通过安装一个不断转变的性质给LinearGradient,再用该Paint对象绘制要显得的文字!

先在onSizeChanged()方法中举行对象的开端化工作

 @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    //闪动效果的对象初始化工作
    if(mViewWidth==0){
        mViewWidth=getMeasuredWidth();
        if(mViewWidth>0){
            //通过getPaint()方法获取绘制TextView的画笔
            mPaint=getPaint();
            mLinearGradient= new LinearGradient(0,0,mViewWidth,0,
                    new int[]{Color.BLACK,0xffffffff,Color.BLACK}, 
                    null,Shader.TileMode.CLAMP);
            //将该属性赋予给paint对象的shader渲染器
            mPaint.setShader(mLinearGradient);
            mGradientMatrix =new Matrix();
        }
    }
}

下一场我们再在onDraw方法中绘制出边框,背景;并通过矩阵的法子来不断运动渐变效果。最终落得我们想要的效率

 @Override
protected void onDraw(Canvas canvas) {
    //绘制字体之前
    //我们在这里绘制外矩形
    canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),mPaint1);
    //绘制内矩形
    canvas.drawRect(5,5,getMeasuredWidth()-5,getMeasuredHeight()-5,mPaint2);
    //绘制字体之前向右平移5像素
    canvas.translate(5,0);
    canvas.save();
    //开始绘制字体
    super.onDraw(canvas);
    //绘制字体之后
    canvas.restore();
    if (mGradientMatrix !=null){
        mTranslate += mViewWidth / 5;
        if(mTranslate>2*mViewWidth){
            mTranslate=-mViewWidth;
        }
        mGradientMatrix.setTranslate(mTranslate,0);
        mLinearGradient.setLocalMatrix(mGradientMatrix);
        postInvalidateDelayed(100);
    }
}

2.使用

本条就相比简单而来,就像大家平日应用TextView一样,只是需要留意的的是行使该类的全路径

 <com.timen.ronny.newtextview.view.FlashTextView
    android:layout_marginTop="30dp"
    android:textColor="@android:color/black"
    android:id="@+id/text2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Android程序员日记 "
    android:padding="5dp"
    android:textSize="30dp"
    android:layout_centerHorizontal="true" />

3.看效果

憋坏了啊!结果来看那样大一个广告,别打我,下次给您放美人图!

4.扩展

本人想对于新手(也就是自家自己,不指旁人)来讲,诸如Matrix、LinearGradient可能没有接触过。关于这一个类和api,我提议大家能够协调去查一下,毕竟自己动手弄领会的事物,影象会越来越的深入!所以在这边我就不复制粘贴了!

那扩展扩的,跟没扩一样!话不佳这么讲啊!毕竟:

授人以鱼,不如授人以渔!

后记

小结一下对于自定义控件,用到相比较多,也正如关键的回调方:

  • onFinishInflate():加载完XML组件后回调
  • onSizeChanged():组件大小改变时回调
  • onMeasure():回调该方法来拓展测量
  • onLayout():回调该措施来呈现地方
  • onTouch伊芙nt():监听到触摸事件回调

那么扩充型自定义(其实应该称为半自定义)View的兑现,就是在原始控件的基础上通过下边的这一部分回调方法来添加实现您想要的部分效能,比如下面分外带背景框和字体闪动效果TextView。

我的github源码:https://github.com/luorenyu/FlashTextView.git

最重大:喜欢就扫描上边的职能图关注自己的众生号


相关文章

网站地图xml地图