课程将从启动速度、内存、卡顿、电量、流量、瘦身等多个纬度进行原理剖析以及解决实战,同时每个章节还配备了模拟面试环节,颠覆你对性能优化的理解,最终让你的技术能力和优化经验得到前所未有的提升。
适合人群
具备一定自学能力;
想要学习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));
}
}
以上是内存溢出为你收集整理的国内Top团队大牛带你玩转Android性能分析与优化全部内容,希望文章能够帮你解决国内Top团队大牛带你玩转Android性能分析与优化所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)