我司主要从事工业物联网领域软件的开发,现有个需求,在外废品处理时需要对产品的不良位置进行标记,点选图片实现图片网格的着色功能。

需求是通过自定义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实现图片热区效果的更多相关文章

  1. 自定义view实现水波纹效果

    水波纹效果: 1.标准正余弦水波纹: 2.非标准圆形液柱水波纹: 虽说都是水波纹,但两者在实现上差异是比较大的,一个通过正余弦函数模拟水波纹效果,另外一个会运用到图像的混合模式(PorterDuffX ...

  2. android自定义view实现progressbar的效果

    一键清理是很多Launcher都会带有的功能,其效果也比较美观.实现方式也许有很多中,其中常见的是使用图片drawable来完成的,具体可以参考这篇文章:模仿实现360桌面水晶球式的一键清理特效.本文 ...

  3. 安卓自定义View实现图片上传进度显示(仿QQ)

    首先看下我们想要实现的效果如下图(qq聊天中发送图片时的效果): 再看下图我们实现的效果: 实现原理很简单,首先我们上传图片时需要一个进度值progress,这个不管是自己写的上传的方法还是使用第三方 ...

  4. Android 自定义view实现水波纹效果

    http://blog.csdn.net/tianjian4592/article/details/44222565 在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了 ...

  5. android自定义View之3D索引效果

    效果图: 我的小霸王太卡了. 最近工作比较忙,今天搞了一下午才搞出来这个效果,这种效果有很多种实现方式,最常见的应该是用贝塞尔曲线实现的.今天我们来看另一种不同的实现方式,只需要用到 canvas.s ...

  6. 自定义View实现图片的绘制、旋转、缩放

    1.图片 把一张JPG图片改名为image.jpg,然后拷贝到项目的res-drawable中. 2.activity_main.xml <LinearLayout xmlns:android= ...

  7. android 缩放平移自定义View 显示图片

    1.背景 现在app中,图片预览功能肯定是少不了的,用户基本已经形成条件反射,看到小图,点击看大图,看到大图两个手指开始进行放大,放大后,开始移动到指定部位~~~ 我相信看图的整个步骤,大家或者说用户 ...

  8. Android自定义View——刮刮卡效果

    想要红包的实现效果的可以关注我的博客,仿饿了么红包 下层图片:我们的红包的图片 上层图片:有两部分 一部分是灰色背景 一部分是拥有透明度为0,并且模式为交集的画笔 使用滑动监听,滑动时,用透明度为0的 ...

  9. ios 在storyboard 和 xib中,显示自定义view的预览效果

    发现FSCalendar这个控件能在xib中显示预览效果,是怎么实现的呢?其中涉及的知识又有哪些? 主要就是IBInspectable 和 IB_DESIGNABLE 先看 IBInspectable ...

随机推荐

  1. Deepin下python安装uwsgi报错: Python.h:没有那个文件或目录

    解决方法是安装python-dev,这是Python的头文件和静态库包 正在读取软件包列表... 完成正在分析软件包的依赖关系树       正在读取状态信息... 完成       下列软件包是自动 ...

  2. vue相关网站资源收集

    因为接了一个使用VUE + ES6 + Webpack的项目,所以在工作之余,也加紧了对这些知识的学习,这里放上遇到的觉得不错的网站链接: 1 vue官网 https://cn.vuejs.org 2 ...

  3. 代码中jndi数据源的支持

    项目中基本都使用Spring框架,支持jndi还是很简单的,只需在spring配置文件中加入 <!-- 使用jndi配置数据源 --> <bean id="dataSour ...

  4. Erlang 日期和时间处理、时间戳转换

    http://www.csdn 123.com/html/blogs/20131113/95993.htm 获取当前时间 erlang:now()得到的是从1970年1月1日零时起,到现在经过的时间, ...

  5. [Codevs 1107][NOIP 1107]等效表达

    主题连接:http://codevs.cn/problem/1107/ 一道非常奇妙的题目. 对于算术表达式一类的问题,能够採用编译原理里的后缀表达式的方式来做.详细做法是分别维护两个栈,一个栈里保存 ...

  6. 机器学习: TensorFlow 的数据读取与TFRecords 格式

    最近学习tensorflow,发现其读取数据的方式看起来有些不同,所以又重新系统地看了一下文档,总得来说,tensorflow 有三种主流的数据读取方式: 1) 传送 (feeding): Pytho ...

  7. windows 安装 RabbitMQ 并添加用户 – 畅玩Coding

    原文:windows 安装 RabbitMQ 并添加用户 – 畅玩Coding 1.RabbitMQ 使用 Eralng,所以需要先安装 Eralng 下载: http://www.erlang.or ...

  8. Sublime Text3中JSX支持Emmet快捷键

    在复习React的过程中,发现Sublime有些快捷键不能用了,如Emmet的Tab快速生成HTML代码只能用Ctrl+E快捷键,而不能用Tab键了,在网上找了很多文章,发现都有问题,最终自己通过下面 ...

  9. 如何向数据库添加时同时返回ID

    我们在做项目开发时很多时候都需要数据库的增删改查,而添加数据后又想得到该项数据在数据库中的主键值,这里有一个非常方便的方法可以在插入数据的同时获得主键值. public void save(Perso ...

  10. 使用Apache Tiles3.x构建界面布局

    Tiles是一个免费的开源模板Java应用程序的框架.基于复合模式简化的用户界面的构建.对于复杂的网站仍是最简单.最优雅的方式与任何MVC技术一起工作.Struts2对Tiles提供了支持,如今Til ...