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

下面是源码.

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}" ><RelativeLayoutandroid:id="@+id/myRtLayout"android:layout_width="wrap_content"android:layout_height="110dp"android:paddingLeft="10dp"android:paddingRight="10dp"/></LinearLayout>
												

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

  1. gitee项目能用SVN拉取吗_安卓开发工程师-简历范文,【工作经历+项目经验+自我评价】怎么写...

    安卓开发工程师-简历模板,项目经验+自我评价怎么写 [网盘下载]100+清新大气简历模板: https://zhuanlan.zhihu.com/p/115911695 https://zhuanla ...

  2. 安卓开发基础知识3(国内深度摄像头方案)

    需求说明:安卓开发 内容       :双摄像头安卓手机调研 来自       :时间的诗 原文:http://www.tuicool.com/articles/zUzmAnu 引言:市场对深度视觉技 ...

  3. 安卓开发艺术探索!各种风格的Android面试题进来了解一下,含爱奇艺,小米,腾讯,阿里

    上周喜提oppo面试offer,本人在深圳,有4年多的Android项目经验,普通本科学历. 面试是相互相在,OPPO给我的印象确实如其核心价值观所说:本分. 一面.部长面和HR面都蛮顺利(一千个人可 ...

  4. 安卓开发艺术探索总结

    2019.1.11到2019.2.11历时一个月,这本书还算比较详细看完了,虽然说出版时间比较早,里面一些技术没有紧跟当前,这本书主要是教会我们的是安卓思想方面,还有对源码的分析,等等其他方面,这本书 ...

  5. Android安卓开发中图片缩放讲解

    安卓开发中应用到图片的处理时候,我们通常会怎么缩放操作呢,来看下面的两种做法: 方法1:按固定比例进行缩放 在开发一些软件,如新闻客户端,很多时候要显示图片的缩略图,由于手机屏幕限制,一般情况下,我们 ...

  6. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)

    关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...

  7. 安卓开发小知识 - 3

    内容来源:Android Development Tidbits // No. 3 这是第三次分享安卓开发中的一些小知识点.我们很高兴有这么多人知道了这个有趣的系列,并且对你们通过评论和邮件表达的支持 ...

  8. 如何搭建安卓开发持续化集成环境(Ubuntu + Jenkins + SonarQube)

    本文讲的是如何搭建安卓开发持续化集成环境(Ubuntu + Jenkins + SonarQube), 我最近换了一台新的 MacBook Pro 作为我的 Android 开发机.旧的 Mac Bo ...

  9. 安卓开发中的USB转串口通讯

    安卓开发中的USB转串口通讯 本文使用GitHub上开源的"hoho.android.usbserial"USB串口库.该库基于"Android USB Host API ...

最新文章

  1. 大剑无锋之DQL、DML、DDL、DCL,简单举个例子【面试推荐】
  2. asp.net表单提交方法GET\POST
  3. 本地如何搭建IPv6环境测试你的APP
  4. 安全随笔2:对称加密应用场景
  5. HDU 2187 悼念512汶川大地震遇难同胞——老人是真饿了
  6. 排序算法(1)----选择排序算法
  7. jQuery实际案例③——手风琴的效果
  8. cocos2d0基础篇笔记二
  9. Ubuntu通过apt-get安装指定版本和查询软件源有多少个版本
  10. paip.提升性能------服务器环境及编程语言架构选择
  11. 存储在U盘中的文件被误删后怎么免费恢复
  12. VOSviewer | (二)入门-分析web of science
  13. [杂记]注册电气工程师考试复习及考试杂谈
  14. 如何打印身份证的正反面
  15. android+国家区号api,android国际区号选择器
  16. 广告创意设计都有哪些类型
  17. 随机子空间(RSM)
  18. 什么是涡以及vortex和eddy的区别
  19. Unreal Engine 4 控制台命令参数合集
  20. Win10应用商店、应用打不开或闪退的解决方法

热门文章

  1. Python周刊505期
  2. css+html 在文字下面加点。
  3. 记录:为啥没有雷电4接口的显卡扩展坞与移动硬盘?
  4. 如何降低自动化维护成本?
  5. 无法打开U盘中的虚拟机
  6. (十六)《汇编语言(王爽)》 | 实验 10:编写子程序
  7. 是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
  8. XP系统谷歌浏览器一直提示“adobe flash player 因过期而遭阻止”解决方法
  9. XPAND恩帝泵800克健美补充剂,脂肪燃烧,激素原
  10. Android studio 写xml的不能自动补全的问题