安卓开发自己写的刻度尺测量,精确到mm.

来源:互联网 发布:淘宝信用卡代付套现 编辑:程序博客网 时间:2024/05/01 04:28

我也是刚学安卓不久,只不过去实习有个项目需要这样的功能就写了,有些也是参考前人的。今天发出来希望对各位朋友有所启发。源码已经注释很清楚。
效果如下图:显示





下面是源码.

MainActivity.java

package cizi.com.example.cizi;import android.annotation.SuppressLint;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.FontMetrics;import android.graphics.Rect;import android.os.Bundle;import android.util.DisplayMetrics;import android.view.MotionEvent;import android.view.View;import android.view.WindowManager;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.TextView;public class MainActivity extends Activity {// 自定义布局public RelativeLayout rtLayout;// 类对象public MyBgrView myBgrView;private MyDrawLine myDrawLine;public TextView tv_num;// 屏幕属性private int scr_w;// 结果提示信息public String str = "100";// 第一次布局View.lyout(View.Layout放在Acticity无效)private boolean b_ctlView = false;// 距离顶部final public int top = 50;// 背景边距剪切public float ali_cut;//屏幕分辨率public DisplayMetrics dm = new DisplayMetrics();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//这个是动态添加布局rtLayout = (RelativeLayout) findViewById(R.id.myRtLayout);myBgrView = new MyBgrView(this);myDrawLine = new MyDrawLine(this);rtLayout.addView(myBgrView);rtLayout.addView(myDrawLine);myBgrView.setOnTouchListener(keduListener);// 获取屏幕高宽WindowManager wmManager = this.getWindowManager();scr_w = wmManager.getDefaultDisplay().getWidth();}public int getScr_w() {return scr_w;}public boolean getCtlView() {return b_ctlView;}public void CclNum(View v, MotionEvent event,int lastX, int lastY){double f;// 移动中动态设置位置int dx = (int) event.getRawX() - lastX;//int dy = (int) event.getRawY() - lastY;int left = v.getLeft() + dx;int top = v.getTop();int right = v.getRight() + dx;int bottom = v.getBottom();// 防止超出刻度线if (left > scr_w >> 1) {left = scr_w >> 1;right = left + v.getWidth();}if (right < (scr_w >> 1) + ali_cut * 2) {right = (scr_w >> 1) + (int) ali_cut * 2;left = right - v.getWidth();}//这个是以图片最左端位置来计算刻度与数字显示的正确位置//(算法原理大概是以长度计算占总长度的几分之几*乘以划分的份数此处刻度份数200)f = (((scr_w >> 1) - v.getLeft() + ali_cut) * 200.0 / ((v.getRight() - ali_cut) - (v.getLeft() + ali_cut)));int f1 = (int) f;//偏差1,可能算法问题if (f1 < 0)f1 = 0;else if (f1 > 201)f1 = 201;f1--;//赋值显示str = f1 + "mm";//重新移动布局v.layout(left, top, right, bottom);}// 监听@SuppressLint("ClickableViewAccessibility")private ImageView.OnTouchListener keduListener = new ImageView.OnTouchListener() {int lastX, lastY;/** * @param v * @param event * @return */public boolean onTouch(View v, MotionEvent event) {int action = event.getAction();switch (action) {case MotionEvent.ACTION_DOWN:b_ctlView = true;// getRaw相对于手机左上角lastX = (int) event.getRawX();lastY = (int) event.getRawY();break;case MotionEvent.ACTION_MOVE:CclNum(v, event, lastX, lastY);lastX = (int) event.getRawX();lastY = (int) event.getRawY();break;case MotionEvent.ACTION_UP:break;default:break;}return true;}};//DrawImgpublic void DrawImg(Canvas canvas, Bitmap bmp, int x, int y, int w, int h,int bx, int by) {Rect src_rect = new Rect();Rect dst_rect = new Rect();// src_rect表示绘制图片的部分src_rect.left = bx;src_rect.top = by;src_rect.right = bx + w;src_rect.bottom = by + h;// dst_rect表示绘制的屏幕上的区域dst_rect.left = x;dst_rect.top = y;dst_rect.right = x + w;dst_rect.bottom = y + h;canvas.drawBitmap(bmp, src_rect, dst_rect, null);}public void DrawText(Canvas canvas,String strText,String strNum) {Paint paint = new Paint();paint.setStyle(Paint.Style.FILL);paint.setStrokeWidth(4);// 字体显示提示// 设置此项之后绘制的x,y表示字体的中心paint.setTextAlign(Paint.Align.CENTER);// 计算或者试着字体属性paint.setTextSize(35);paint.setColor(Color.LTGRAY);FontMetrics fontMetrics = paint.getFontMetrics();//获取字体宽高float fh = fontMetrics.bottom - fontMetrics.top;float fw = paint.measureText(strNum);//还差半个字float fw1 = paint.measureText("壠");canvas.drawText(strText, ((int)fw >> 1) + ((int)fw1 >> 1), 60 - ((int) fh >> 1), paint);//字体颜色paint.setColor(Color.GREEN);fh = fontMetrics.bottom - fontMetrics.top;canvas.drawText(strNum, (getScr_w() >> 1) + 10 + ((int)fw1 >> 1), 60 - ((int) fh >> 1), paint);}//画线游标public void DrawLine(Canvas canvas,Paint paint){canvas.drawLine(getScr_w() >> 1, 50, getScr_w() >> 1, 100,paint);}}//用于绘制背景class MyBgrView extends View {static MainActivity mActivity = null;// 绘制属性private int w;private int h;private Bitmap bmp;// 屏幕宽度private int scr_w;public MyBgrView(Context context) {super(context);// TODO Auto-generated constructor stubmActivity = (MainActivity) context;bmp = BitmapFactory.decodeResource(getResources(), R.drawable.kedu);w = bmp.getWidth();h = bmp.getHeight();//如果有多个可以这样设置标签//this.setTag("MyBgrView");}//@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas); if (mActivity.getCtlView() == false)        {scr_w = mActivity.getScr_w();// 计算应该剪切空白边距mActivity.ali_cut = w / (float) 203.6 * (float) 1.8;// 中间显示int sw = (scr_w >> 1) - (w >> 1) + (int) mActivity.ali_cut;this.layout(sw, 0, w + sw, h + mActivity.top);this.setTop(mActivity.top);}mActivity.DrawImg(canvas, bmp, 0, 0, w, h, 0,0);}}//画线类@SuppressLint("DrawAllocation")class MyDrawLine extends View {private MainActivity mActivity = null;public MyDrawLine(Context context) {super(context);mActivity = (MainActivity) context;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint paint = new Paint();paint.setColor(Color.RED);paint.setStyle(Paint.Style.FILL);paint.setStrokeWidth(4);mActivity.DrawText(canvas, "总量",mActivity.str);mActivity.DrawLine(canvas,paint);invalidate();}}
布局文件:activity_main.xml
<pre name="code" class="html"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="${relativePackage}.${activityClass}" >     <RelativeLayout        android:id="@+id/myRtLayout"        android:layout_width="wrap_content"        android:layout_height="110dp"        android:paddingLeft="10dp"        android:paddingRight="10dp"/></LinearLayout>



下面是DEMO链接,是百度云,为什么在这找不到上传文件的地方惊恐。要是有什么问题可以发我QQ邮箱:724989068@qq.com.

链接:http://pan.baidu.com/s/1sj85soX 密码:elc0


0 0
原创粉丝点击