免責事項:この記事はブロガーオリジナル記事ですが、許可ブロガーなく再生してはなりません。https://blog.csdn.net/Coder_Hcy/article/details/72781519
1.模造QQの歩数計(統計カスタムビュー用)
ステップ:
1.プロパティを定義します
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="TongjiView">
<attr name="firstColor" format="color"></attr>
<attr name="secondColor" format="color"></attr>
<attr name="borderWidth" format="dimension"></attr>
<attr name="tongjiTextSize" format="dimension"></attr>
<attr name="tongjiTextColor" format="color"></attr>
<attr name="tongjiText" format="string"></attr>
</declare-styleable>
</resources>
2.プロパティを取ります
public TongjiView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//获取自定义属性
Log.i(TAG,"TongjiView3");
TypedArray array=context.obtainStyledAttributes(attrs,R.styleable.TongjiView);
mFirstColor=array.getColor(R.styleable.TongjiView_firstColor, Color.GRAY);
mSecondColor=array.getColor(R.styleable.TongjiView_secondColor,Color.BLACK);
mTongjiTextColor=array.getColor(R.styleable.TongjiView_tongjiTextColor,Color.BLACK);
mBorderWidth= (int) array.getDimension(R.styleable.TongjiView_borderWidth,20);
mTongjiTextSize=array.getDimensionPixelSize(R.styleable.TongjiView_tongjiTextSize,20);
mTongjiText=array.getString(R.styleable.TongjiView_tongjiText);
array.recycle();
initPaint();
initTextPaint();
}
3. 2つの円弧とテキストを描画
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.i(TAG,"onDraw");
mPaint.setColor(mFirstColor);
//画第一层
int circleCenter=getWidth()/2;
int radius=getHeight()/2-mBorderWidth/2;//直接减去画笔的宽度也行
RectF rectF=new RectF(circleCenter-radius,circleCenter-radius,circleCenter+radius,circleCenter+radius);
canvas.drawArc(rectF,135,270,false,mPaint);
//画第二层
mPaint.setColor(mSecondColor);
canvas.drawArc(rectF,135,(270*currentSecondProgress)/maxSecondProgress,false,mPaint);
//画文字
Rect textBounds=new Rect();
mTextPaint.getTextBounds(mTongjiText,0,mTongjiText.length(),textBounds);
Paint.FontMetricsInt fontMetrics = mTextPaint.getFontMetricsInt();
int baseLineY = getHeight()/2 - (fontMetrics.bottom-fontMetrics.top)/2- fontMetrics.top;
canvas.drawText(mTongjiText,getWidth()/2-textBounds.width()/2,baseLineY,mTextPaint);
}
package com.wyt.hcy.testcustomview;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
/**
* Created by hcy on 2017/5/27 0027.
*/
public class TongjiView extends View {
private int mFirstColor;
private int mSecondColor;
private int mBorderWidth;
private int mTongjiTextColor;
private int mTongjiTextSize;
private Paint mPaint;
private static final String TAG="TongjiView";
private int maxSecondProgress=100;
private int currentSecondProgress=80;
private Paint mTextPaint;
private String mTongjiText;
public TongjiView(Context context) {
this(context, null);
Log.i(TAG,"TongjiView1");
}
public TongjiView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
Log.i(TAG,"TongjiView2");
}
public TongjiView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//获取自定义属性
Log.i(TAG,"TongjiView3");
TypedArray array=context.obtainStyledAttributes(attrs,R.styleable.TongjiView);
mFirstColor=array.getColor(R.styleable.TongjiView_firstColor, Color.GRAY);
mSecondColor=array.getColor(R.styleable.TongjiView_secondColor,Color.BLACK);
mTongjiTextColor=array.getColor(R.styleable.TongjiView_tongjiTextColor,Color.BLACK);
mBorderWidth= (int) array.getDimension(R.styleable.TongjiView_borderWidth,20);
mTongjiTextSize=array.getDimensionPixelSize(R.styleable.TongjiView_tongjiTextSize,20);
mTongjiText=array.getString(R.styleable.TongjiView_tongjiText);
array.recycle();
initPaint();
initTextPaint();
}
private void initTextPaint() {
mTextPaint=new Paint();
mTextPaint.setAntiAlias(true);//抗锯齿
mTextPaint.setStyle(Paint.Style.STROKE);
mTextPaint.setTextSize(mTongjiTextSize);
mTextPaint.setColor(mTongjiTextColor);
}
private void initPaint() {
Log.i(TAG,"initPaint");
mPaint=new Paint();
mPaint.setAntiAlias(true);//抗锯齿
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(mBorderWidth);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Log.i(TAG,"onMeasure");
int width = 0,height = 0;
int widthMode=MeasureSpec.getMode(widthMeasureSpec);
int widthSize=MeasureSpec.getSize(widthMeasureSpec);
int heightMode=MeasureSpec.getMode(heightMeasureSpec);
int heightSize=MeasureSpec.getSize(heightMeasureSpec);
//保持一个正方形
Log.i(TAG,"widthSize:"+widthSize);
Log.i(TAG,"heightSize:"+heightSize);
setMeasuredDimension(widthSize,heightSize);
/*if (widthMode==MeasureSpec.AT_MOST){
Log.i(TAG,"widthMode==MeasureSpec.AT_MOST");
width=40;//设置最小宽度
}else if (widthMode==MeasureSpec.EXACTLY){
Log.i(TAG,"widthMode==MeasureSpec.EXACTLY");
width=widthSize;
}
if (heightMode==MeasureSpec.AT_MOST){
Log.i(TAG,"heightMode==MeasureSpec.AT_MOST");
height=40;
}else if (heightMode==MeasureSpec.EXACTLY){
height=heightSize;
Log.i(TAG,"heightMode==MeasureSpec.EXACTLY");
}
//宽高不一致,获取最小的
int length=width>height?height:width;
Log.i(TAG,"length:"+length);
setMeasuredDimension(width>height?height:width,width>height?height:width); //保持一个正方形
//*/
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.i(TAG,"onDraw");
mPaint.setColor(mFirstColor);
//画第一层
int circleCenter=getWidth()/2;
int radius=getHeight()/2-mBorderWidth/2;//直接减去画笔的宽度也行
RectF rectF=new RectF(circleCenter-radius,circleCenter-radius,circleCenter+radius,circleCenter+radius);
canvas.drawArc(rectF,135,270,false,mPaint);
//画第二层
mPaint.setColor(mSecondColor);
canvas.drawArc(rectF,135,(270*currentSecondProgress)/maxSecondProgress,false,mPaint);
//画文字
Rect textBounds=new Rect();
mTextPaint.getTextBounds(mTongjiText,0,mTongjiText.length(),textBounds);
Paint.FontMetricsInt fontMetrics = mTextPaint.getFontMetricsInt();
int baseLineY = getHeight()/2 - (fontMetrics.bottom-fontMetrics.top)/2- fontMetrics.top;
canvas.drawText(mTongjiText,getWidth()/2-textBounds.width()/2,baseLineY,mTextPaint);
}
}
難易度:
1.円弧を描きます、
中心座標のカスタムビューで定義された中心点(のgetWidth()/ 2、/ 2のgetHeight)
定義されたRectF
2.テキストを描画するとき、どのように判断するための基準を
baseLineY = centerY - (fm.bottom-fm.top)/ 2- fm.top。
3.知識ポイント:4つのプロパティの表示:
トップ:親血管の座標に対して左側トップ
左:親コンテナの横軸に対して、左上
右:右下の親コンテナの横軸に関して
底:親コンテナの右下に対して縦
翻訳相対座標値が変化しないとき
他の4つのパラメータを表示します。
X:横軸に対するスクリーンの左上隅を見ます
Y:縦座標に関して、画面の左上隅の表示
translationXは:一見親コンテナの横の画面に対しては理解されよ
translationY:親画面の縦軸に対して容器ことを理解しているように見えます
4.ビューは、スライド可能に三つの方法を達成します
それ自体でscrollTo 1.表示/ scrollBy方法
2.パンアニメーション
layoutparams 3.