安卓开发自己写的刻度尺测量,精确到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
- 安卓开发自己写的刻度尺测量,精确到mm.
- (转)android自己写的类似刻度尺的东西。
- android自己写的类似刻度尺的东西
- android自己写的类似刻度尺的东西
- 安卓开发中自己常用到的小知识
- 测量坐标系换算的安卓程序开发
- 自己写的安卓简易浏览器
- 自己写的异步下载 安卓
- 使用android studio添加自己写的依赖报错 安卓开发
- 安卓开发——让系统可以调用自己写的视频播放器
- Android自定义一个属于自己的刻度尺
- 安卓开发-自己实现CursorAdapter将数据的数据装载到ListView
- 如何去追自己喜欢的MM?-----------女生写的
- 安卓字体测量
- 自己写的安卓程序如何改变图标
- 【安卓开发艺术探索】第4章 View的测量、布局、绘制 笔记
- Windows平台精确到0.1ms测量程序代码段执行时间: 比opencv自带的准
- 安卓开发中遇到测试TextView测量宽高
- 阿里巴巴2015秋季校招(客户端开发工程师岗位)在线笔试题
- 正则之邮箱,QQ,网址的写法
- 数据结构之队列的顺序实现
- UML九种图概述
- UIGestureRecognizer
- 安卓开发自己写的刻度尺测量,精确到mm.
- oracle学习笔记——存储过程
- MinHashing基本原理
- Websphere系统hang原因调查
- leetCode 116.Populating Next Right Pointers in Each Node (为节点填充右指针) 解题思路和方法
- PHP 编码风格规范指南
- iOS中关于UILabel删除线NSStrikethroughStyleAttributeName的使用
- Linux设备驱动开发——环境搭建
- 预编译相关详解