国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android自定義View之邊框文字、閃爍發光文字

2019-12-12 04:04:35
字體:
來源:轉載
供稿:網友

對現有控件進行擴展

1、繪制如下所示的兩層背景的TextView

創建BorderTextView繼承TextView

在構造函數中初始化一些基本數據

 //外邊框    mPaint1 = new Paint();    mPaint1.setColor(getResources().getColor(android.R.color.holo_blue_bright));    //畫筆的樣式,充滿    mPaint1.setStyle(Paint.Style.FILL);    //內邊框    mPaint2 = new Paint();    mPaint2.setColor(Color.YELLOW);    mPaint2.setStyle(Paint.Style.FILL);

重寫onDraw()方法,在此方法中主要通過canvas對象,來進行繪畫。

 @Override  protected void onDraw(Canvas canvas) {    //繪制外層矩形    canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),mPaint1);    //繪制內層矩形    canvas.drawRect(10,10,getMeasuredWidth()-10,getMeasuredHeight()-10,mPaint2);    canvas.save();//保存之前的狀態    //水平平移10px    canvas.translate(10,10);    //回調父類方法之前,實現自己的邏輯,則會被文本遮蓋    super.onDraw(canvas);    //方法之后實現,則內容會覆蓋文本    canvas.restore();//恢復之前的狀態  }

如果以上結束之后運行,會發現文字無法完全顯示,是因為,我們平移了文字之后,但文字本身的大小并沒有變化,導致文字顯示不全,我們需要去重載onMeasure()方法,對TextView的寬高重新計算。

  @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    super.onMeasure(widthMeasureSpec, heightMeasureSpec);    //因為我們重繪了TextView的上下左右的邊框,所以其寬高應該各增大10*2    setMeasuredDimension(getMeasuredWidth()+20,getMeasuredHeight()+20);  }

總結:
1. onMeasure()方法用來決定控件大小,onDraw()方法用來繪制。
2. setMeasuredDimension(width,height)設置控件的寬高

2、閃光的文字

該實現主要通過LinearGradient線性渲染對象來進行顏色的改變。

在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){        mPaint = getPaint();        mLinearGradient = new LinearGradient(0,0,mViewWidth,0,                new int[]{Color.BLUE,0XFFFFFFFF,Color.BLUE},                null,            Shader.TileMode.CLAMP            );        mPaint.setShader(mLinearGradient);        mGradientMatrix = new Matrix();      }    }  }

獲取我們文字的大小,并獲取該文字的Paint對象,同時初始化LinearGradient對象。

創建LinearGradient并設置漸變顏色數組

public LinearGradient (float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile); // 第一個,第二個參數表示漸變起點 可以設置起點終點在對角等任意位置 // 第三個,第四個參數表示漸變終點 // 第五個參數表示漸變顏色 // 第六個參數可以為空,表示坐標,值為0-1 new float[] {0.25f, 0.5f, 0.75f, 1 } // 如果這是空的,顏色均勻分布,沿梯度線。 // 第七個表示平鋪方式 // CLAMP重復最后一個顏色至最后 // MIRROR重復著色的圖像水平或垂直方向已鏡像方式填充會有翻轉效果 // REPEAT重復著色的圖像水平或垂直方向

初始化Matrix對象。該對象主要用于改變渲染器的值,具體講解請看此博客http://blog.csdn.net/flash129/article/details/8234599

在onDraw()方法中進行改變Matrix對象,并設置給渲染器,同時刷新試圖,形成循環。

  @Override  protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    if(mGradientMatrix!=null){      mTranslate += mViewWidth/5;      //當該控件渲染器的顏色變化正好移除屏幕時,從左側進入      if(mTranslate>2*mViewWidth){        mTranslate = - mViewWidth;      }      mGradientMatrix.setTranslate(mTranslate,0);      mLinearGradient.setLocalMatrix(mGradientMatrix);      //100ms 后繼續刷新試圖,即調用onDraw()方法。      postInvalidateDelayed(100);    }  }

總結:
1. 通過LinearGradient來設置圖像的漸變色。
2. Matrix改變漸變色的平移對象
關于自定義View的源碼已上傳到github。如需源碼請移步https://github.com/AlexSmille/CustomView

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 抚远县| 唐海县| 华安县| 海晏县| 罗甸县| 新河县| 黄大仙区| 兰西县| 神木县| 太白县| 和平区| 赤城县| 遵义县| 拜泉县| 铜梁县| 宁蒗| 安吉县| 林周县| 平泉县| 晋城| 东乡族自治县| 炉霍县| 三台县| 株洲县| 恩平市| 雷州市| 乐亭县| 鄢陵县| 宁德市| 西安市| 讷河市| 鄂尔多斯市| 腾冲县| 黄大仙区| 肃宁县| 阿图什市| 本溪| 北辰区| 太康县| 青田县| 乌兰县|