自定义View之扩张式

前言

在求学的征程上,有一句跨领域的话正是“教永远是最好的学”!那么本人希望经过友好的享用能够更好的帮助到有的亟需的人!
笔者也能够对自个儿的缺乏进行回看!

bwin亚洲必赢5566手机版,自定义View在android开发中,能够说是一件感觉相比高档的业务了,那实在自定义view也分为好两种!日常来说大家也给他分为七个层次:

  1. 扩张已有控件
  • 开创复合控件
  • 贯彻全新的控件

正文

在此处笔者也为我们准备了3个实例FlashTextView
先看一下效果图
这是十分小概的,大家把豪华留到最后!一上来就高潮,那是一种病,得治!

其一成效实在正是透过对TextView举行三个简单的增加就可见落实

1.实现

率先大家先创制3个类让它集成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渲染器。通过安装2个相连变更的属性给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的贯彻,便是在原本控件的基本功上经过地点的这一部分回调方法来添加实现您想要的片段效率,比如上边11分带背景框和字体闪动作效果果TextView。

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

最要紧:喜欢就扫描下面的效能图关心本身的民众号