Android 圖像 Y = sinX;

最近在做自定義控件,溫習(xí)下draw方法,畫(huà)個(gè)函數(shù)軌跡圖。代碼上來(lái):

importandroid.content.Context;

importandroid.graphics.Canvas;

importandroid.graphics.Color;

importandroid.graphics.Paint;

importandroid.graphics.Path;

importandroid.support.annotation.Nullable;

importandroid.util.AttributeSet;

importandroid.view.View;

importandroid.view.WindowManager;

/**

* Created by Administrator on 2017/9/13.

*/

public classDrawViewextendsView {

privatePaintmPaintLine;

privatePaintmCirclePaint;

publicDrawView(Context context) {

super(context);

init();

}

publicDrawView(Context context,@NullableAttributeSet attrs) {

super(context, attrs);

init();

}

publicDrawView(Context context,@NullableAttributeSet attrs,intdefStyleAttr) {

super(context, attrs, defStyleAttr);

init();

}

private voidinit() {

//添加線(xiàn)畫(huà)筆

mPaintLine=newPaint();

mPaintLine.setStrokeWidth(5);

mPaintLine.setStyle(Paint.Style.STROKE);

mPaintLine.setColor(Color.BLACK);

mPaintLine.setFlags(Paint.ANTI_ALIAS_FLAG);

//添加圓畫(huà)筆(畫(huà)點(diǎn))

mCirclePaint=newPaint();

mCirclePaint.setColor(Color.RED);

mCirclePaint.setFlags(Paint.ANTI_ALIAS_FLAG);

}

@Override

protected voidonDraw(Canvas canvas) {

super.onDraw(canvas);

//先畫(huà)橫軸

drawXLine(canvas);

//再畫(huà)縱軸

drawYLine(canvas);

//畫(huà)橫軸箭頭

drawXArrow(canvas);

//畫(huà)縱坐標(biāo)箭頭

drawYArrow(canvas);

//標(biāo)記原點(diǎn)

drawCenterPoint(canvas);

//畫(huà)函數(shù)軌跡,以y=sinx為例

drawPathRight(canvas);

drawPathLeft(canvas);

}

private voiddrawPathLeft(Canvas canvas) {

Path path=newPath();

path.moveTo(width/2,height/2);

//0,-360

for(inti =0; i <480; i++) {

//為了繪畫(huà)明顯,擴(kuò)大相應(yīng)的比例

//假設(shè)右邊能完整顯示2個(gè)周期,即至少平分為三等分,width/6=180度長(zhǎng)度,1度=width/180/6

floatx =width/6/180* -i +width/2;

//假設(shè)Y的上半軸能平均分成4分,即height/2/4=1單位高度;

floaty = (float) (ponitX(-i) *height/8) +height/2;

path.lineTo(x, y);

}

canvas.drawPath(path,mPaintLine);

}

private voiddrawPathRight(Canvas canvas) {

Path path =newPath();

path.moveTo(width/2,height/2);

//這里用角度制

for(inti1 =0; i1 <480; i1++) {

//為了繪畫(huà)明顯,擴(kuò)大相應(yīng)的比例

//假設(shè)右邊能完整顯示2個(gè)周期,即至少平分為三等分,width/6=180度長(zhǎng)度,1度=width/180/6

floatx =width/6/180* i1 +width/2;

//假設(shè)Y的上半軸能平均分成4分,即height/2/4=1單位高度;

floaty = (float) (ponitX(i1) *height/8) +height/2;

path.lineTo(x, y);

}

canvas.drawPath(path,mPaintLine);

}

private doubleponitX(inti) {

//把弧度制轉(zhuǎn)化為角度制運(yùn)算

returnMath.sin(Math.PI/180* i);

}

private voiddrawCenterPoint(Canvas canvas) {

canvas.drawCircle(width/2,height/2,10,mCirclePaint);

}

floatwidth= ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth();

floatheight= ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getHeight();

private voiddrawYArrow(Canvas canvas) {

Path path =newPath();

path.moveTo(width/2-20,20);

path.lineTo(width/2,0);

path.lineTo(width/2+20,20);

canvas.drawPath(path,mPaintLine);

}

private voiddrawXArrow(Canvas canvas) {

Path path =newPath();

path.moveTo(width-20,height/2-20);

path.lineTo(width,height/2);

path.lineTo(width-20,height/2+20);

canvas.drawPath(path,mPaintLine);

}

private voiddrawYLine(Canvas canvas) {

floatstartX =width/2;

floatstartY =0;

floatstopX = startX;

floatstopY =height;

canvas.drawLine(startX, startY, stopX, stopY,mPaintLine);

}

private voiddrawXLine(Canvas canvas) {

floatstartX =0;

floatstartY =height/2;

floatstopX =width;

floatstopY = startY;

canvas.drawLine(startX, startY, stopX, stopY,mPaintLine);

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容