前言

当学习之道及,有相同句跨领域的讲话就是“教永远是无比好之仿”!那么自己梦想经过协调之享用会再次好的救助及有急需之人头!
我吧会针对自己之供不应求进行回顾!

由定义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():回调该办法来展示位置
  • onTouchEvent():监听到触摸事件回调

那么扩展类型从定义(其实当称为半于定义)View的实现,就是于原来控件的基础及通过上面的马上有回调方法来补充加实现公想要的一部分效应,比如上面很带背景框和字体闪动效果TextView。

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

最为关键:喜欢就扫描上面的功能图关注自己的群众号


相关文章

网站地图xml地图