最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

android自定義控件實(shí)現(xiàn)簡(jiǎn)易時(shí)間軸(2)

 更新時(shí)間:2022年01月24日 17:19:36   作者:哈哈哈哈哈哈_Y  
這篇文章主要為大家詳細(xì)介紹了android自定義控件實(shí)現(xiàn)簡(jiǎn)易時(shí)間軸的第二篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

這篇做了一個(gè)簡(jiǎn)單的時(shí)間軸控件。右側(cè)的數(shù)據(jù)就是一個(gè)簡(jiǎn)單的字符串。問(wèn)題還是有的,當(dāng)右側(cè)的文字長(zhǎng)度不一樣的時(shí)候就會(huì)有問(wèn)題了?,F(xiàn)在可以修改一下適配右側(cè)的文字。

效果如下:

代碼:

private Paint bgPaint, linePaint, borderPaint,textPaint;
private Rect bgRect, textRect;

//基本屬性
private int mTextSize;
private int mTextColor;
private String mTextTitle="默認(rèn)文本內(nèi)容";

private int lineColr = Color.parseColor("#AAAAAA");
private int borderColor = Color.parseColor("#AAAAAA");
private int bgColor = Color.parseColor("#138DDD");
private int mBorderColor=0xFFDDDDDD;
private int mBorderWidth = 10;
private int mLineColor=Color.parseColor("#ff000000");
private int mLineWidth = 2;
private int mLineHeight;
private int mBgColor;

private ?int mWidth =0;
private ?int mHeight =300;//整個(gè)控件的寬和高

//line繪制
private int lineLocation = -1;//0 ?上方 1 ?下方 2 ?上下兩個(gè)
private int mRadius = 90;//直徑,最終會(huì)被寬高限制

//設(shè)置line的位置 0 ?上方 1 ?下方 2 ?上下兩個(gè)

public void setLineLocation(int lineLocation) {
? ? ? ? this.lineLocation = lineLocation;
? ? }


//設(shè)置純色的整圓形,包括背景
public void setBgAndBorderColor(int color) {
? ? ? ? this.mBgColor = color;
? ? }

? ? public void setmHeight(int mHeight) {

? ? ? ? this.mHeight = mHeight;
? ? }

? ? public void setmBorderColor(int mBorderColor) {
? ? ? ? this.mBorderColor = mBorderColor;
? ? }

? ? public void setmTextTitle(String mTextTitle) {
? ? ? ? this.mTextTitle = mTextTitle;
? ? }

? ? public void setmRadius(int mRadius) {
? ? ? ? this.mRadius = mRadius;
? ? }

? ? public void setmLineHeight(int mLineHeight) {
? ? ? ? this.mLineHeight = mLineHeight;
? ? }

? ? public TimeLineSingleView(Context context) {
? ? ? ? this(context,null);
? ? }

? ? public TimeLineSingleView(Context context, AttributeSet attrs) {
? ? ? ? this(context, attrs,0);
? ? }

? ? public TimeLineSingleView(Context context, AttributeSet attrs, int defStyleAttr) {
? ? ? ? super(context, attrs, defStyleAttr);

? ? ? ? TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomCicleView, defStyleAttr, 0);
? ? ? ? int n = a.getIndexCount();
? ? ? ? for (int i = 0; i < n; i++) {
? ? ? ? ? ? int attr = a.getIndex(i);
? ? ? ? ? ? switch (attr) {
? ? ? ? ? ? ? ? case R.styleable.CustomCicleView_textSize:
? ? ? ? ? ? ? ? ? ? // 默認(rèn)設(shè)置為16sp,TypeValue也可以把sp轉(zhuǎn)化為px
? ? ? ? ? ? ? ? ? ? mTextSize = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(
? ? ? ? ? ? ? ? ? ? ? ? ? ? TypedValue.COMPLEX_UNIT_DIP, 14, getResources().getDisplayMetrics()));
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? case R.styleable.CustomCicleView_textColor:
? ? ? ? ? ? ? ? ? ? mTextColor = a.getColor(attr, Color.BLACK);
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? case R.styleable.CustomCicleView_textTitle:
? ? ? ? ? ? ? ? ? ? mTextTitle = a.getString(attr);
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? case R.styleable.CustomCicleView_lineWidth:
? ? ? ? ? ? ? ? ? ? mLineWidth = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(
? ? ? ? ? ? ? ? ? ? ? ? ? ? TypedValue.COMPLEX_UNIT_DIP, 2, getResources().getDisplayMetrics()));
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? case R.styleable.CustomCicleView_lineColor:
? ? ? ? ? ? ? ? ? ? mLineColor = a.getColor(attr, lineColr);
? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? case R.styleable.CustomCicleView_mRadius:
? ? ? ? ? ? ? ? ? ? mRadius=a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(
? ? ? ? ? ? ? ? ? ? ? ? ? ? TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics()));
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? case R.styleable.CustomCicleView_borderWidth:
? ? ? ? ? ? ? ? ? ? mBorderWidth = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(
? ? ? ? ? ? ? ? ? ? ? ? ? ? TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics()));
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? case R.styleable.CustomCicleView_borderColor:
? ? ? ? ? ? ? ? ? ? mBorderColor = a.getColor(attr, borderColor);
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? case R.styleable.CustomCicleView_bgColor:
? ? ? ? ? ? ? ? ? ? mBgColor = a.getColor(attr, bgColor);
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? a.recycle();
? ? ? ? bgPaint = new Paint();
? ? ? ? borderPaint = new Paint();
? ? ? ? linePaint = new Paint();
? ? ? ? textPaint = new Paint();
? ? ? ? textRect = new Rect();
? ? ? ? textPaint.setTextSize(mTextSize);

? ? }

? ? //EXACTLY :在準(zhǔn)確的數(shù)值和Match_parent的狀態(tài)是這個(gè)值 列表中,wrap_content的狀態(tài)下必須計(jì)算一個(gè)合適的值
? ? @Override
? ? protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
? ? ? ? super.onMeasure(widthMeasureSpec, heightMeasureSpec);

? ? ? ? int w = 0;
? ? ? ? int h =0;
? ? ? ? int widthMode=MeasureSpec.getMode(widthMeasureSpec);
? ? ? ? int heightMode=MeasureSpec.getMode(heightMeasureSpec);
? ? ? ? int widthSize = MeasureSpec.getSize(widthMeasureSpec);
? ? ? ? int heightSize = MeasureSpec.getSize(heightMeasureSpec);

? ? ? ? if(widthMode==MeasureSpec.EXACTLY){

? ? ? ? ? ? w=widthSize;
? ? ? ? }else{
? ? ? ? ? ? w=Math.max(mHeight,mRadius+getPaddingRight()+getPaddingLeft());
? ? ? ? }

? ? ? ? if(heightMode==MeasureSpec.EXACTLY){

? ? ? ? ? ? h=heightSize;
? ? ? ? }else{
? ? ? ? ? ? h=Math.max(mHeight,mRadius+getPaddingTop()+getPaddingBottom());
? ? ? ? }

? ? ? ? setMeasuredDimension(w,h);
? ? ? ? }

? ? @Override
? ? protected void onDraw(Canvas canvas) {

? ? ? ? super.onDraw(canvas);


? ? ? ? int centreX = getWidth()/ 2; // 獲取圓心的x坐標(biāo)
? ? ? ? int centreY=getHeight()/2;

? ? ? ? //半徑比較
? ? ? ? mBorderWidth =(mBorderWidth>=mRadius/10)?(mRadius/10):mBorderWidth;//半徑的1/5
? ? ? ? int radius = mRadius/2 - mBorderWidth / 2;// 半徑

? ? ? ? if(mLineHeight<=0){

? ? ? ? ? ? mLineHeight=Math.abs(getHeight()/2-radius);//這個(gè)地方要判斷設(shè)置正負(fù)
? ? ? ? }
? ? ? ? //繪制圓

? ? ? ? bgPaint.setAntiAlias(true); // 消除鋸齒
? ? ? ? bgPaint.setColor(mBgColor);
? ? ? ? bgPaint.setStyle(Paint.Style.FILL); // 設(shè)置實(shí)心
? ? ? ? canvas.drawCircle(centreX, centreY, radius, bgPaint);
? ? ? ? //繪制圓環(huán)
? ? ? ? borderPaint.setStrokeWidth(mBorderWidth); // 設(shè)置圓環(huán)的寬度
? ? ? ? borderPaint.setAntiAlias(true); // 消除鋸齒
? ? ? ? if (mBorderColor != 0) {
? ? ? ? ? ? borderPaint.setColor(mBorderColor);
? ? ? ? } else {
? ? ? ? ? ? borderPaint.setColor(borderColor);
? ? ? ? }
? ? ? ? borderPaint.setStyle(Paint.Style.STROKE); // 設(shè)置實(shí)心
? ? ? ? canvas.drawCircle(centreX,centreY, radius - mBorderWidth / 2+mLineWidth/2, borderPaint);

? ? ? ? //繪制文本
? ? ? ? textPaint.setTextSize(mTextSize);
? ? ? ? textPaint.setColor(mTextColor);
? ? ? ? textPaint.getTextBounds(mTextTitle, 0, mTextTitle.length(), textRect);

? ? ? ? canvas.drawText(mTextTitle, centreX -textRect.width()/2-mBorderWidth/2, centreY ?+ textRect.height() / 2, textPaint);


? ? ? ? //繪制線條
? ? ? ? drawLineAll(canvas,centreX,centreY,radius);

? ? }
? ? //上下都繪制不用
? ? //1 ?上方 0 ?下方 2 ?上下兩個(gè)

? ? private void drawLineAll(Canvas canvas, ?float centreX, float centreY,int radius) {

? ? ? ? if(lineLocation==-1){
? ? ? ? ? ? linePaint.setColor(borderColor);
? ? ? ? ? ? linePaint.setStrokeWidth(mLineWidth);
? ? ? ? ? ? canvas.drawLine(centreX, 0, centreX, centreY-radius, linePaint);//上方的
? ? ? ? ? ? canvas.drawLine(centreX, centreY+radius, centreX, getHeight(), linePaint);//下方的
? ? ? ? }else{
? ? ? ? ? ? //這個(gè)可以繪制不同的line
? ? ? ? ? ? linePaint.setColor(lineColr);
? ? ? ? ? ? linePaint.setStrokeWidth(mLineWidth);
? ? ? ? ? ? if (lineLocation == 0) {
? ? ? ? ? ? ? ? canvas.drawLine(centreX, centreY+radius, centreX, getHeight(), linePaint);
? ? ? ? ? ? } else if (lineLocation == 1) {
? ? ? ? ? ? ? ? canvas.drawLine(centreX, 0, centreX, centreY -radius , linePaint);

? ? ? ? ? ? } else if (lineLocation == 2) {
? ? ? ? ? ? ? ? canvas.drawLine(centreX, centreY+radius, centreX, getHeight(), linePaint);
? ? ? ? ? ? ? ? canvas.drawLine(centreX, 0, centreX, centreY -radius , linePaint);
? ? ? ? ? ? }
? ? ? ? }

? ? }

其他代碼和之前文章一樣就不貼了,但是還有一個(gè)問(wèn)題就是,這個(gè)控件是放在一個(gè)列表里面的,你在適配器中使用的時(shí)候布局要是wrap的狀態(tài)下要計(jì)算一個(gè)合適的高度,比如listView 的Item的高度。這里我沒(méi)有實(shí)現(xiàn),還是在Match和固定高度中,后期更改。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

定襄县| 兴安盟| 中西区| 兴城市| 云林县| 北川| 陵川县| 怀柔区| 湾仔区| 南丰县| 漠河县| 遂溪县| 探索| 榆中县| 绥芬河市| 汉中市| 绥芬河市| 宜黄县| 德江县| 新泰市| 旺苍县| 壤塘县| 太仆寺旗| 永新县| 刚察县| 海宁市| 靖江市| 霞浦县| 松江区| 梅河口市| 宁明县| 瑞金市| 宝应县| 康保县| 区。| 石渠县| 临澧县| 朔州市| 东乡族自治县| 密云县| 花莲市|