自定义View实现图片热区效果
我司主要从事工业物联网领域软件的开发,现有个需求,在外废品处理时需要对产品的不良位置进行标记,点选图片实现图片网格的着色功能。
需求是通过自定义view来实现,实现思路如下:
首先将点击的小方格对象实例化,创建小方格PointBean对象
/**
* 图片上的点
*/
public class PointBean { private int x_max; private int x_mix; private int y_min; private int y_max; private String picPointName; public String getPicPointName() {
return picPointName;
} public void setPicPointName(String picPointName) {
this.picPointName = picPointName;
} public int getX_max() {
return x_max;
} public void setX_max(int x_max) {
this.x_max = x_max;
} public int getX_mix() {
return x_mix;
} public void setX_mix(int x_mix) {
this.x_mix = x_mix;
} public int getY_min() {
return y_min;
} public void setY_min(int y_min) {
this.y_min = y_min;
} public int getY_max() {
return y_max;
} public void setY_max(int y_max) {
this.y_max = y_max;
}
}
继承ImageView,捕捉对控件点击的坐标,在坐标内进行矩形的绘制
public class CustomImageView extends android.support.v7.widget.AppCompatImageView { private boolean firstDrawBl = true; List<Rectangle> rectangleList = new ArrayList<>(); List<PointBean> pointList = new ArrayList<>();
//对图片的横坐标和纵坐标进行解析
String [] h_name = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P"};
String [] l_name = {"1","2","3","4","5","6","7","8","9","10","11","12"}; private onPointClickListener onPointClickListener;
//设置对点击事件的监听
public void setOnChosePoint(onPointClickListener pointListener){
this.onPointClickListener = pointListener;
} public CustomImageView(Context context){
super(context);
} public CustomImageView(Context context, @Nullable AttributeSet attrs){
super(context,attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
Drawable d = getDrawable(); if(d!=null){
// ceil not round - avoid thin vertical gaps along the left/right edges
int width = MeasureSpec.getSize(widthMeasureSpec);
//高度根据使得图片的宽度充满屏幕计算而得
int height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth());
setMeasuredDimension(width, height);
}else{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
//利用(Canvas与Paint)绘制显示的内容
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
int left = getLeft();
int right = getRight();
int top = getTop();
int bottom = getBottom();
Log.e("msgCustomView","左面坐标:"+left+"右面坐标:"+right);
Log.e("msgCustomView","上面坐标:"+top+"下面坐标:"+bottom);
for(Rectangle rectangle:rectangleList){
//绘制矩形方格
rectangle.drawSelf(canvas,paint);
}
//对图片进行横竖分隔解析成小方格
if(firstDrawBl){
int wk = right -left;
int hk = bottom-top;
int positionX = left+wk/18;
for(int i=0;i<16;i++){
int positionY = top+hk/14;
for(int j=0;j<12;j++){
PointBean pointBean = new PointBean();
pointBean.setX_mix(positionX);
pointBean.setX_max(positionX+wk/18);
pointBean.setY_min(positionY);
pointBean.setY_max(positionY+hk/14);
positionY = positionY+hk/14;
pointBean.setPicPointName(h_name[i]+"_"+l_name[j]);
pointList.add(pointBean);
}
positionX = positionX+wk/18;
}
firstDrawBl = false;
}
}
//处理控件的触摸事件
@Override
public boolean onTouchEvent(MotionEvent event) {
//获取手指的行为
int action = event.getAction();
int action_code = action&0xff;
//手指的下标Index
int pointIndex = action>>8;
//获取手指的坐标
float x = event.getX(pointIndex);
float y = event.getY(pointIndex);
Log.e("自定义控件","点击坐标:"+"("+x+","+y+")");
//获取手指的名字ID
int pointerId = event.getPointerId(pointIndex);
// if(action_code>=5){
// action_code-=5;
// }
switch (action_code){
case MotionEvent.ACTION_DOWN://按下
for(PointBean pointBean:pointList){
if(x<pointBean.getX_max()&&x>pointBean.getX_mix()&&y>pointBean.getY_min()&&y<pointBean.getY_max()){
Rectangle rectangle = new Rectangle(pointBean, pointerId);
rectangleList.add(rectangle);
onPointClickListener.onChoose(pointBean.getPicPointName());
}
}
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_MOVE:
break;
}
//对view进行重新布局绘制
invalidate();
return true;
}
//定义接口,将点击事件坐标回调
public interface onPointClickListener{
public void onChoose(String pointName);
} } 矩形对象的绘制
/**
* 绘画矩形对象
*/
public class Rectangle { private int xMin; private int xMax; private int yMin; private int yMax; private int poinitId;
int red;
int green;
int blue;
Random random = new Random(); public Rectangle(PointBean pointBean,int pointId){
this.xMin = pointBean.getX_mix();
this.xMax = pointBean.getX_max();
this.yMin = pointBean.getY_min();
this.yMax = pointBean.getY_max();
this.poinitId = pointId;
red = random.nextInt(255);
green = random.nextInt(255);
blue = random.nextInt(255);
}
public void drawSelf(Canvas canvas, Paint paint){
paint.setColor(Color.rgb(red,green,blue));
// canvas.drawCircle(x,y,r,paint);
Log.e("图片绘制图片","x坐标:"+xMin+"y坐标:"+yMin+"x大坐标:"+xMax+"y大坐标"+yMax);
canvas.drawRect(xMin,yMin,xMax,yMax,paint); }
}
自定义View实现图片热区效果的更多相关文章
- 自定义view实现水波纹效果
水波纹效果: 1.标准正余弦水波纹: 2.非标准圆形液柱水波纹: 虽说都是水波纹,但两者在实现上差异是比较大的,一个通过正余弦函数模拟水波纹效果,另外一个会运用到图像的混合模式(PorterDuffX ...
- android自定义view实现progressbar的效果
一键清理是很多Launcher都会带有的功能,其效果也比较美观.实现方式也许有很多中,其中常见的是使用图片drawable来完成的,具体可以参考这篇文章:模仿实现360桌面水晶球式的一键清理特效.本文 ...
- 安卓自定义View实现图片上传进度显示(仿QQ)
首先看下我们想要实现的效果如下图(qq聊天中发送图片时的效果): 再看下图我们实现的效果: 实现原理很简单,首先我们上传图片时需要一个进度值progress,这个不管是自己写的上传的方法还是使用第三方 ...
- Android 自定义view实现水波纹效果
http://blog.csdn.net/tianjian4592/article/details/44222565 在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了 ...
- android自定义View之3D索引效果
效果图: 我的小霸王太卡了. 最近工作比较忙,今天搞了一下午才搞出来这个效果,这种效果有很多种实现方式,最常见的应该是用贝塞尔曲线实现的.今天我们来看另一种不同的实现方式,只需要用到 canvas.s ...
- 自定义View实现图片的绘制、旋转、缩放
1.图片 把一张JPG图片改名为image.jpg,然后拷贝到项目的res-drawable中. 2.activity_main.xml <LinearLayout xmlns:android= ...
- android 缩放平移自定义View 显示图片
1.背景 现在app中,图片预览功能肯定是少不了的,用户基本已经形成条件反射,看到小图,点击看大图,看到大图两个手指开始进行放大,放大后,开始移动到指定部位~~~ 我相信看图的整个步骤,大家或者说用户 ...
- Android自定义View——刮刮卡效果
想要红包的实现效果的可以关注我的博客,仿饿了么红包 下层图片:我们的红包的图片 上层图片:有两部分 一部分是灰色背景 一部分是拥有透明度为0,并且模式为交集的画笔 使用滑动监听,滑动时,用透明度为0的 ...
- ios 在storyboard 和 xib中,显示自定义view的预览效果
发现FSCalendar这个控件能在xib中显示预览效果,是怎么实现的呢?其中涉及的知识又有哪些? 主要就是IBInspectable 和 IB_DESIGNABLE 先看 IBInspectable ...
随机推荐
- Deepin下python安装uwsgi报错: Python.h:没有那个文件或目录
解决方法是安装python-dev,这是Python的头文件和静态库包 正在读取软件包列表... 完成正在分析软件包的依赖关系树 正在读取状态信息... 完成 下列软件包是自动 ...
- vue相关网站资源收集
因为接了一个使用VUE + ES6 + Webpack的项目,所以在工作之余,也加紧了对这些知识的学习,这里放上遇到的觉得不错的网站链接: 1 vue官网 https://cn.vuejs.org 2 ...
- 代码中jndi数据源的支持
项目中基本都使用Spring框架,支持jndi还是很简单的,只需在spring配置文件中加入 <!-- 使用jndi配置数据源 --> <bean id="dataSour ...
- Erlang 日期和时间处理、时间戳转换
http://www.csdn 123.com/html/blogs/20131113/95993.htm 获取当前时间 erlang:now()得到的是从1970年1月1日零时起,到现在经过的时间, ...
- [Codevs 1107][NOIP 1107]等效表达
主题连接:http://codevs.cn/problem/1107/ 一道非常奇妙的题目. 对于算术表达式一类的问题,能够採用编译原理里的后缀表达式的方式来做.详细做法是分别维护两个栈,一个栈里保存 ...
- 机器学习: TensorFlow 的数据读取与TFRecords 格式
最近学习tensorflow,发现其读取数据的方式看起来有些不同,所以又重新系统地看了一下文档,总得来说,tensorflow 有三种主流的数据读取方式: 1) 传送 (feeding): Pytho ...
- windows 安装 RabbitMQ 并添加用户 – 畅玩Coding
原文:windows 安装 RabbitMQ 并添加用户 – 畅玩Coding 1.RabbitMQ 使用 Eralng,所以需要先安装 Eralng 下载: http://www.erlang.or ...
- Sublime Text3中JSX支持Emmet快捷键
在复习React的过程中,发现Sublime有些快捷键不能用了,如Emmet的Tab快速生成HTML代码只能用Ctrl+E快捷键,而不能用Tab键了,在网上找了很多文章,发现都有问题,最终自己通过下面 ...
- 如何向数据库添加时同时返回ID
我们在做项目开发时很多时候都需要数据库的增删改查,而添加数据后又想得到该项数据在数据库中的主键值,这里有一个非常方便的方法可以在插入数据的同时获得主键值. public void save(Perso ...
- 使用Apache Tiles3.x构建界面布局
Tiles是一个免费的开源模板Java应用程序的框架.基于复合模式简化的用户界面的构建.对于复杂的网站仍是最简单.最优雅的方式与任何MVC技术一起工作.Struts2对Tiles提供了支持,如今Til ...