大厂资深面试官 带你破解Android高级面试
作者:互联网
download:大厂资深面试官 带你破解Android高级面试
课程专为Android中高级工程师打造,针对面试中可能遇到的关键知识,进行深入分析讲解,为面试者还原面试官视角,带领面试者打开视野,快速在面试中突出亮点取得高分,拿下高薪。
适合人群
具备一定自学能力的Android 工程师
想跳槽面试的Android 中高级工程师
技术储备要求
扎实的 Java 基础,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));
}
}
标签:面试官,int,float,private,score,大厂,ring,outter,Android 来源: https://blog.51cto.com/u_15134643/2703927