download:国内Top团队大牛带你玩转Android性能分析与优化
课程将从启动速度、内存、卡顿、电量、流量、瘦身等多个纬度进行原理剖析以及解决实战,同时每个章节还配备了模拟面试环节,颠覆你对性能优化的理解,最终让你的技术能力和优化经验得到前所未有的提升。
适合人群
技术储备要求
具备Android开发经验
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.View;
import java.text.NumberFormat;
class FinancescoreDialView extends View{
private double score; //
private int ranking;
private String mscoreTitleStr; //表盤標題
private String mRankingTitleStr;
private int mscoreAxisLineColor; //表盤刻度文字
public void setscoreTitleColor(int mscoreTitleColor) {
this.mscoreTitleColor = mscoreTitleColor;
}
public void setscoreColor(int mscoreColor) {
this.mscoreColor = mscoreColor;
}
public void setRankingTitleColor(int mRankingTitleColor) {
this.mRankingTitleColor = mRankingTitleColor;
}
public void setRankingColor(int mRankingColor) {
this.mRankingColor = mRankingColor;
}
private int mscoreTitleColor; //表盤標題文字颜色
private int mscoreColor;
private int mRankingTitleColor;
private int mRankingColor;
public void setInnerscoreRingColor(int mInnerscoreRingColor) {
this.mInnerscoreRingColor = mInnerscoreRingColor;
}
public void setouterscoreRingColor(int mOuterscoreRingColor) {
this.mOuterscoreRingColor = mOuterscoreRingColor;
}
public void setouterscoreSelRingColor(int mOuterscoreSelRingColor) {
this.mOuterscoreSelRingColor = mOuterscoreSelRingColor;
}
public void setscoreAxisLineColor(int axisLineColor){
this.mscoreAxisLineColor = axisLineColor;
}
private int mInnerscoreRingColor;
private int mOuterscoreRingColor;
private int mOuterscoreSelRingColor;
private float totalscore = 100;
private float stepDegree = -1;
public void setscoreAxisLables(int scoreAxisLables) {
this.scoreAxisLables = scoreAxisLables;
axisLabelStrs = new String[scoreAxisLables];
float step = totalscore / (scoreAxisLables-1);
for (int i =0; i< scoreAxisLables; i++){
axisLabelStrs[i] = String.valueOf(nFormat2.format(step i));
}
float sweepAngle = 180+Math.abs(2offset_degree);
stepDegree = sweepAngle/(scoreAxisLables-1);
}
private int scoreAxisLables;
private String[] axisLabelStrs;
private float axislinewidth = Tool.dpToPx(0.5f);
private float axisLableTextSize = Tool.dpToPx(12);
private Paint axisLablePaint = new Paint();
private float leftmargin = Tool.dpToPx(5);
private float v_margin = Tool.dpToPx(15);
private float h_space = Tool.dpToPx(15);
private float ring_space = Tool.dpToPx(5);
private float outter_ringWidth = Tool.dpToPx(1);
private float inner_ringWidth = Tool.dpToPx(5);
private Paint rankingTextPaint = new Paint();
private Paint scoreTextPaint = new Paint();
private Paint scoreRingPaint = new Paint();
private float scoreTitleTextSize = Tool.dpToPx(14);
private float rankingTitleTextSize = Tool.dpToPx(14);
private float scoreTextSize = Tool.dpToPx(40);
private float rankingTextSize = Tool.dpToPx(30);
private static final float offset_degree = -10; //負代表往下偏移10度
private float maxOutterscoreDiameter = -1;
private float maxOutterscoreRadius = -1;
private float innerscoreDiameter = -1;
private RectF ring_rectf = new RectF();
private static NumberFormat nFormat = NumberFormat.getNumberInstance();
private static NumberFormat nFormat2 = NumberFormat.getNumberInstance();
static{
nFormat.setMaximumFractionDigits(2);
nFormat.setMinimumFractionDigits(2);
nFormat2.setMaximumFractionDigits(0);
}
public FinancescoreDialView(Context context) {
super(context);
init();
}
private void init(){
rankingTextPaint.setAntiAlias(true);
scoreTextPaint.setAntiAlias(true);
scoreRingPaint.setAntiAlias(true);
}
public void setValues(double[] values){
if(null != values){
if(values.length >0){
score = values[0];
}
if(values.length >1 ){
ranking = (int)values[1];
}
}
}
public void setscoreTitleString(String str){
this.mscoreTitleStr = str;
}
public void setRankingTitleString(String str){
this.mRankingTitleStr = str;
}
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
int specWidth = MeasureSpec.getSize(widthMeasureSpec);
int measuredWidth = specWidth;
int measuredHeight = 0;
scoreTextPaint.setTextSize(scoreTitleTextSize);
float scoretitle_h = getFontHeight(scoreTextPaint);
float scoretitle_w = scoreTextPaint.measureText(mscoreTitleStr);
scoreTextPaint.setTextSize(scoreTextSize);
float score_h = getFontHeight(scoreTextPaint);
float score_w = scoreTextPaint.measureText(nFormat.format(score));
float totalh_score = scoretitle_h + Tool.dpToPx(5) + score_h;
float totalw_score = Math.max(scoretitle_w,score_w) + 2Tool.dpToPx(20);
float score_diameter = Math.max(totalw_score, totalh_score);
float max_outter_score_diameter = score_diameter + 2 (inner_ringWidth + ring_space + outter_ringWidth);
maxOutterscoreDiameter = max_outter_score_diameter;
innerscoreDiameter = max_outter_score_diameter - 2(outter_ringWidth + ring_space);
float max_outter_score_radius = max_outter_score_diameter/2;
maxOutterscoreRadius = max_outter_score_radius;
measuredHeight += max_outter_score_radius;
double rAngle = Math.toradians(90 - (-180 + offset_degree));
measuredHeight += Math.abs(max_outter_score_radiusMath.cos(rAngle));
measuredHeight += 2v_margin;
setMeasuredDimension(measuredWidth, measuredHeight);
}
public void onDraw(Canvas canvas){
int startX = getScrollX();
int startY = getScrollY();
rankingTextPaint.setTextSize(rankingTitleTextSize);
rankingTextPaint.setColor(mRankingTitleColor);
float rankingTitleBaseline = startY + v_margin + getFontTopYToBaseline(rankingTextPaint);
canvas.drawText(mRankingTitleStr, startX + leftmargin, rankingTitleBaseline, rankingTextPaint);
float rankingTitle_w = rankingTextPaint.measureText(mRankingTitleStr);
//圆心縱横坐標
float centerX = startX + leftmargin + h_space + rankingTitle_w + maxOutterscoreDiameter/2;
float centerY =startY + v_margin + maxOutterscoreDiameter/2;
float max_outter_ring_startX = centerX - maxOutterscoreDiameter/2 + outter_ringWidth/2;
float max_outter_ring_startY = v_margin + outter_ringWidth/2;
float max_outter_ring_endX = max_outter_ring_startX + maxOutterscoreDiameter - outter_ringWidth;
float max_outter_ring_endY = max_outter_ring_startY + maxOutterscoreDiameter - outter_ringWidth;
ring_rectf.set(max_outter_ring_startX, max_outter_ring_startY, max_outter_ring_endX, max_outter_ring_endY);
scoreRingPaint.setStyle(Paint.Style.stroke);
scoreRingPaint.setstrokeWidth(outter_ringWidth);
scoreRingPaint.setColor(mOuterscoreRingColor);
float startAngle = -180 + offset_degree;
float sweepAngle = 180+Math.abs(2offset_degree);
float sweepAngle1 = (float)(sweepAngle score/ totalscore);
if(sweepAngle1 > sweepAngle || (sweepAngle-sweepAngle1<1)){
sweepAngle1 = sweepAngle;
}
canvas.drawArc(ring_rectf,startAngle,sweepAngle,false,scoreRingPaint ); //畫外環
scoreRingPaint.setColor(mOuterscoreSelRingColor);
canvas.drawArc(ring_rectf,startAngle,sweepAngle1,false,scoreRingPaint );
float inner_ring_startX = centerX - innerscoreDiameter/2 + inner_ringWidth/2;
float inner_ring_startY = centerY - innerscoreDiameter/2 + inner_ringWidth/2;
float inner_ring_endX = inner_ring_startX + innerscoreDiameter - inner_ringWidth;
float inner_ring_endY = inner_ring_startY + innerscoreDiameter - inner_ringWidth;
ring_rectf.set(inner_ring_startX, inner_ring_startY, inner_ring_endX, inner_ring_endY);
scoreRingPaint.setstrokeWidth(inner_ringWidth);
scoreRingPaint.setColor(mInnerscoreRingColor);
canvas.drawArc(ring_rectf, startAngle, sweepAngle, false, scoreRingPaint);
for (int i =0; i<scoreAxisLables; i++){
float degree = -1;
degree = -180 + offset_degree + stepDegree i;
double radian = Math.toradians(90-degree);
float shorTradius = innerscoreDiameter/2 - inner_ringWidth;
float longRadius = innerscoreDiameter/2;
double sinValue = Math.sin(radian);
double cosValue = Math.cos(radian);
float x1 = (float) (centerX +shorTradius sinValue);
float y1 = (float)(centerY +shorTradius cosValue);
float x2 = (float)(centerX + longRadius sinValue);
float y2 = (float)(centerY + longRadius cosValue);
scoreRingPaint.setStyle(Paint.Style.stroke);
scoreRingPaint.setstrokeWidth(axislinewidth);
scoreRingPaint.setColor(mscoreAxisLineColor);
canvas.drawLine(x1, y1, x2, y2, scoreRingPaint);
axisLablePaint.setTextSize(axisLableTextSize);
axisLablePaint.setTextAlign(Paint.Align.CENTER);
axisLablePaint.setColor(mInnerscoreRingColor);
float axisLable_fonth = getFontHeight(axisLablePaint);
float labelRadius =innerscoreDiameter/2 - inner_ringWidth - axisLable_fonth/2 + 3;
float x3 = (float) (centerX + labelRadius sinValue);
float y3 =(float) (centerY + labelRadius cosValue);
canvas.save();
canvas.rotate(90+ degree,x3,y3); //绘製倾斜文字
canvas.drawText(axisLabelStrs[i],x3,y3 + getFontCenterYToBaseLine(axisLablePaint),axisLablePaint);
canvas.restore();
}
scoreTextPaint.setTextAlign(Paint.Align.CENTER);
scoreTextPaint.setTextSize(scoreTextSize);
scoreTextPaint.setColor(mscoreColor);
double rAngle = Math.toradians(90 - (-180 + offset_degree)); //弧度
float offset_y = (float)(maxOutterscoreRadius*Math.cos(rAngle));
float scoreBaselineY = centerY + offset_y;
float tempH = getFontTopYToBaseline(scoreTextPaint);
canvas.drawText(nFormat.format(score), centerX, scoreBaselineY, scoreTextPaint);
scoreTextPaint.setTextSize(scoreTitleTextSize);
scoreTextPaint.setColor(mscoreTitleColor);
float scoreTitleBaselineY = scoreBaselineY - tempH - Tool.dpToPx(2);
canvas.drawText(mscoreTitleStr, centerX, scoreTitleBaselineY, scoreTextPaint);
}
public static float getFontHeight(Paint textPaint){
Paint.FontMetrics fm = textPaint.getFontMetrics();
return (float)Math.ceil(fm.descent - fm.ascent) + 3;
}
public static float getFontTopYToBaseline(Paint textPaint){
Paint.FontMetrics fm = textPaint.getFontMetrics();
return (float)Math.ceil(-fm.ascent) + 3;
}
public static float getFontBottomYToBaseline(Paint textPaint){
Paint.FontMetrics fm = textPaint.getFontMetrics();
return (float)Math.ceil(fm.descent) + 3;
}
public static float getFontCenterYToBaseLine(Paint textPaint){
Paint.FontMetrics fm = textPaint.getFontMetrics();
float fonth = getFontHeight(textPaint);
return (float)Math.abs(Math.ceil(fonth/2- fm.descent));
}
}