Android 曲线绘制Demo
16lz
2021-01-23
一个可交互的Android绘制曲线的demo:
Java代码- packagecom.ray.demo;
- importandroid.app.Activity;
- importandroid.content.Context;
- importandroid.graphics.Canvas;
- importandroid.graphics.Color;
- importandroid.graphics.Paint;
- importandroid.graphics.Paint.Style;
- importandroid.graphics.Path;
- importandroid.graphics.Point;
- importandroid.graphics.RectF;
- importandroid.os.Bundle;
- importandroid.view.MotionEvent;
- importandroid.view.View;
- publicclassLineFunActivityextendsActivity{
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(newSampleView(this));
- }
- privateclassSampleViewextendsView{
- publicstaticfinalintRECT_SIZE=8;
- privatePointmSelectedPoint=null;
- publicstaticfinalintPOINT_ARRAY_SIZE=7;
- publicstaticfinalintC_START=0;
- publicstaticfinalintC_END=1;
- publicstaticfinalintC_CONTROL_1=2;
- publicstaticfinalintC_CONTROL_2=3;
- publicstaticfinalintQ_START=4;
- publicstaticfinalintQ_END=5;
- publicstaticfinalintQ_CONTROL=6;
- privatePoint[]mPoints=newPoint[POINT_ARRAY_SIZE];
- publicSampleView(Contextcontext){
- super(context);
- mPoints[C_START]=newPoint(100,100);
- mPoints[C_END]=newPoint(200,200);
- mPoints[C_CONTROL_1]=newPoint(150,100);
- mPoints[C_CONTROL_2]=newPoint(150,200);
- mPoints[Q_START]=newPoint(100,300);
- mPoints[Q_END]=newPoint(150,400);
- mPoints[Q_CONTROL]=newPoint(200,350);
- }
- @Override
- protectedvoidonDraw(Canvascanvas){
- super.onDraw(canvas);
- canvas.drawColor(Color.WHITE);
- //setuppaint
- Paintpaint=newPaint(Paint.ANTI_ALIAS_FLAG);
- paint.setColor(Color.BLACK);
- //drawthecubicline
- Pathpath=newPath();
- path.moveTo(mPoints[C_START].x,mPoints[C_START].y);
- path.cubicTo(mPoints[C_CONTROL_1].x,mPoints[C_CONTROL_1].y,
- mPoints[C_CONTROL_2].x,mPoints[C_CONTROL_2].y,
- mPoints[C_END].x,mPoints[C_END].y);
- paint.setStrokeWidth(2);
- paint.setStyle(Style.STROKE);
- canvas.drawPath(path,paint);
- canvas.drawLine(mPoints[C_START].x,mPoints[C_START].y,
- mPoints[C_CONTROL_1].x,mPoints[C_CONTROL_1].y,paint);
- canvas.drawLine(mPoints[C_END].x,mPoints[C_END].y,
- mPoints[C_CONTROL_2].x,mPoints[C_CONTROL_2].y,paint);
- //drawthequadline
- paint.setColor(Color.BLACK);
- paint.setStyle(Style.FILL);
- paint.setStrokeWidth(2);
- path.reset();
- path.moveTo(mPoints[Q_START].x,mPoints[Q_START].y);
- path.quadTo(mPoints[Q_CONTROL].x,mPoints[Q_CONTROL].y,
- mPoints[Q_END].x,mPoints[Q_END].y);
- canvas.drawPath(path,paint);
- canvas.drawLine(mPoints[Q_START].x,mPoints[Q_START].y,
- mPoints[Q_CONTROL].x,mPoints[Q_CONTROL].y,paint);
- canvas.drawLine(mPoints[Q_END].x,mPoints[Q_END].y,
- mPoints[Q_CONTROL].x,mPoints[Q_CONTROL].y,paint);
- //drawcontrolpoints
- paint.setColor(Color.RED);
- paint.setStyle(Style.FILL);
- for(inti=0;i<POINT_ARRAY_SIZE;i++){
- canvas.drawRect(pointToRect(mPoints[i]),paint);
- }
- }
- @Override
- publicbooleanonTouchEvent(MotionEventevent){
- switch(event.getAction()){
- caseMotionEvent.ACTION_DOWN:
- for(inti=0;i<POINT_ARRAY_SIZE;i++){
- if(pointToRect(mPoints[i]).contains(event.getX(),event.getY())){
- mSelectedPoint=mPoints[i];
- }
- }
- break;
- caseMotionEvent.ACTION_MOVE:
- if(null!=mSelectedPoint){
- mSelectedPoint.x=(int)event.getX();
- mSelectedPoint.y=(int)event.getY();
- invalidate();
- }
- break;
- caseMotionEvent.ACTION_UP:
- mSelectedPoint=null;
- break;
- default:
- break;
- }
- returntrue;
- }
- privateRectFpointToRect(Pointp){
- returnnewRectF(p.x-RECT_SIZE/2,p.y-RECT_SIZE/2,
- p.x+RECT_SIZE/2,p.y+RECT_SIZE/2);
- }
- }
- }
更多相关文章
- Android 代码改变图片颜色android:tint="@color/main_color" and
- Kotlin 写 Android 单元测试(四),Robolectric 在 JVM 上测试安卓相
- 修改 framework 代码的经验和踩过的坑
- android常用颜色代码定义
- android 代码proguard
- Android日志系统分析之日志设备驱动程序代码阅读