在手机屏幕上,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);
}
}