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

需求是通过自定义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. Use Word 2010's Navigation Pane to quickly reorganize documents

    Use Word 2010's Navigation Pane to quickly reorganize documents http://www.techrepublic.com/blog/mic ...

  2. 浏览器对象模型bom的作用是什么?

    浏览器对象模型bom的作用是什么? 零.总结 1.BOM提供了独立于内容而与浏览器窗口进行交互的对象 2.BOM提供了一些访问窗口对象的一些方法,我们可以用它来移动窗口位置,改变窗口大小,打开新窗口和 ...

  3. PHP正则表达式怎么匹配多行

    PHP正则表达式怎么匹配多行 一.总结 1.可以用匹配模式修饰符s来使点匹配所有字符,包括换行符. 二.PHP匹配多行的正则表达式分析 代码如下: <table> <tr>&l ...

  4. 前端切图:CSS实现隐藏滚动条同时又可以滚动

    CSS 实现隐藏滚动条同时又可以滚动 原始功能: 图片发自简书App 添加伪类之后的功能: 图片发自简书App 完整demo如下: <!DOCTYPE html> <html> ...

  5. http协议头文件的控制信息(转)

    通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息.这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成.HTTP的头域包括通用头,请求头,响应 ...

  6. App各种Icon及Launch image的尺寸和用途

    App各种Icon及Launch image的尺寸和用途 IOS7,8 Asset iPhone 6 Plus (@3x) iPhone 6 and iPhone 5 (@2x) iPhone 4s ...

  7. Xamarin.Forms开发APP

    Xamarin.Forms+Prism(1)—— 开发准备 准备: 1.VS2017(推荐)或VS2015: 2.JDK 1.8以上: 3.Xamarin.Forms 最新版: 4.Prism 扩展, ...

  8. 64 位系统 vs2013 配置 OpenCV-3.1.0

    参考:64 位系统 vs2013 配置 opencv3.0 1. 环境准备 进入官网 http://opencv.org/,下载最新版本的 opencv(以本文 opencv-3.1.0 为例,.ex ...

  9. How to configure spring boot through annotations in order to have something similar to <jsp-config> in web.xml?

    JSP file not rendering in Spring Boot web application You will need not one but two dependencies (ja ...

  10. git记不住用户名和密码

    以前我是用svn的 , 我也是最近才用的git 虽然git 有GUI界面  , 但是我觉得还是不如svn 最开始使用git的时候我们直接clone项目的时候可能会设置全局的账号和密码 , 但是我重装系 ...