从今定义View之扩张式

前言

以求学的征宝马X3,有一致句跨领域的讲话虽是“教永远是最为好之模仿”!那么自己要经过自己之分享会重新好的赞助及有些需要的人口!
我吧会针对团结之缺少举办回顾!

自定义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伊芙(Eve)nt():监听到触摸事件回调

那么扩充项目从定义(其实应该叫半起定义)View的实现,就是于老控件的功底及通过上边的当下部分回调方法来补偿加实现而想假如的有的意义,比如下边很带背景框和书闪动效果TextView。

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

极致根本:喜欢就扫描上边的功力图关注我之马自达号