android实现线段长度标注功能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jian11058/article/details/82800955

在手机屏幕上,1:画一条线,并对其进行更改:2:显示距离的小标注居中,且方向与直线方向的更改而更改。以下:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity {

    private Button btn;
    private LinearLayout layout;

    Drawable drawable;
    Bitmap bitmap;
    Canvas canvas;
    Paint paint,painttext;
    private int width,height;
    private static int startX,startY,moveX,moveY,stopX,stopY;
    public static int[] point1,point2;
    int Line=0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //取消标题
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        //取消状态栏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);
        getAndroiodScreenProperty();
        initView();
        initData();
    }
    public void initView(){
        btn=findViewById(R.id.main);
        layout=findViewById(R.id.main_ll);
    }
    private void initData() {
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (Line<5) {
                    Line = Line + 1;
                }else {
                    Line=5;
                }
            }
        });
        paint = new Paint();
        paint.setStrokeWidth(5);//笔宽5像素
        paint.setColor(Color.RED);//设置为红笔
        paint.setTextSize(24);

        painttext= new Paint();
        painttext.setStrokeWidth(5);//笔宽5像素
        painttext.setColor(Color.BLUE);//设置为红笔
        painttext.setTextSize(24);
        //        width, height,解决适配问题
        //	paint.setAntiAlias(false);//锯齿不显示
        bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); //设置位图的宽高,bitmap为透明
//        bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); //设置位图的宽高,bitmap为黑色
        canvas = new Canvas(bitmap);
        canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);//设置为透明,画布也是透明
        canvas.drawLine(0, 20, 750, 200, paint);
        Drawable drawable = new BitmapDrawable(bitmap) ;
        layout.setBackgroundDrawable(drawable);
    }
    public void getAndroiodScreenProperty() {
        WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        width = dm.widthPixels;         // 屏幕宽度(像素)
        height = dm.heightPixels;       // 屏幕高度(像素)
        float density = dm.density;         // 屏幕密度(0.75 / 1.0 / 1.5)
        int densityDpi = dm.densityDpi;     // 屏幕密度dpi(120 / 160 / 240)
        // 屏幕宽度算法:屏幕宽度(像素)/屏幕密度
        int screenWidth = (int) (width / density);  // 屏幕宽度(dp)
        int screenHeight = (int) (height / density);// 屏幕高度(dp)


        Log.d("h_bl", "屏幕宽度(像素):" + width);
        Log.d("h_bl", "屏幕高度(像素):" + height);
        Log.d("h_bl", "屏幕密度(0.75 / 1.0 / 1.5):" + density);
        Log.d("h_bl", "屏幕密度dpi(120 / 160 / 240):" + densityDpi);
        Log.d("h_bl", "屏幕宽度(dp):" + screenWidth);
        Log.d("h_bl", "屏幕高度(dp):" + screenHeight);
    }

    public int getlength(int x,int y,int x1,int y1){
        double a=(y-y1)*(y-y1)+(x-x1)*(x-x1);
        int length=(int) Math.sqrt(a);
        return length;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN://按下
                startX=(int)event.getX();
                startY=(int)event.getY();


                break;
            case MotionEvent.ACTION_MOVE://按下移动
                moveX=(int)event.getX();
                moveY=(int)event.getY();
                if (point2==null) {
                    drawLineOne(startX, startY, moveX, moveY);
                }else {
                    Log.e("x:"+moveX,"  y:"+moveY);
                    if ((startX<point2[0]+20&&startX>point2[0]-20)&&(startY<point2[1]+20&&startY>point2[1]-20)){//当按下的点在point2点范围内,则进行画线
                        drawLineOne(point1[0],point1[1],moveX,moveY);

                    }else if((startX<point1[0]+20&&startX>point1[0]-20)&&(startY<point1[1]+20&&startY>point1[1]-20)){//当按下的点在point1点范围内,则进行画线
                        drawLineOne(point2[0],point2[1],moveX,moveY);
                        Log.e("第一个点再移动:"+moveX,"  y:"+moveY);
                    }
                }
                break;
            case MotionEvent.ACTION_UP://离开屏幕
                stopX=(int)event.getX();
                stopY=(int)event.getY();
                if (point1==null) {
                    point1 = new int[]{startX, stopY};
                    point2 = new int[]{stopX, stopY};
                }else{
                    if ((startX<point1[0]+20&&startX>point1[0]-20)&&(startY<point1[1]+20&&startY>point1[1]-20)) {
                        //当改变第一个点时:将实时动的点赋值给第一个点,要不然,不改变值
                        point1 = new int[]{moveX, moveY};
                    }else if((startX<point2[0]+20&&startX>point2[0]-20)&&(startY<point2[1]+20&&startY>point2[1]-20)){
                        //当改变第二个点时:将实时动的点赋值给第二个点,要不然,不改变值
                        point2=new int[]{moveX, moveY};
                    }
                }
                break;

        }
        return true;
    }
    public void drawLineOne(int x,int y,int x1,int y1){
        canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);//设置为透明,画布也是透明
        canvas.drawLine(x, y, x1, y1, paint);
        paint.setTextAlign(Paint.Align.CENTER);//居中显示
        painttext.setTextAlign(Paint.Align.CENTER);//居中显示

        int length=getlength(x, y, x1, y1);
        Path path=new Path();
        path.moveTo(x,y-18);//直线的起始点,-12表示向y轴上移12个单位
//        path.lineTo( x1, y1);//直线终点
        path.lineTo( x1, y1-18);//直线终点
//        path.lineTo( 150, 120);//直线终点
        canvas.drawTextOnPath(""+length,path,0,0,paint);//vOffset设置垂直方向位移的距离。
//        canvas.drawText(""+length,(x+x1)/2,(y+y1)/2-12, painttext);//字体
        Drawable drawable = new BitmapDrawable(bitmap) ;
        layout.setBackgroundDrawable(drawable);
    }

}

效果图

猜你喜欢

转载自blog.csdn.net/jian11058/article/details/82800955
今日推荐