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

需求是通过自定义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. php如何利用标准输入输出实现在一个字符串中计算某个字符出现的个数?

    php如何利用标准输入输出实现在一个字符串中计算某个字符出现的个数? 一.总结 php实现计算字符个数(php标准输入和输出:fgets(STDIN)  echo $output;) 1.php标准输 ...

  2. [Ramda] Filter an Array Based on Multiple Predicates with Ramda's allPass Function

    In this lesson, we'll filter a list of objects based on multiple conditions and we'll use Ramda's al ...

  3. js如何遍历表单所有控件

    js如何遍历表单所有控件 一.总结 一句话总结: 1.获取form表单里面的的所有元素:通过formelement.elements,这里form元素通过name属性直接定位 var fele=for ...

  4. 从研究try catch 捕获不到异步错误谈谈学习方法的问题

    先看下面的代码,思考一下输出 try { throw new Error(3) } catch (e) { console.log(e) } try { setTimeout(function () ...

  5. Read-Copy Update Implementation For Non-Cache-Coherent Systems

    A technique for implementing read-copy update in a shared-memory computing system having two or more ...

  6. Dropout 理论基础与实战细节

    Dropout: A Simple Way to Prevent Neural Networks from Overfitting 对于 dropout 层,在训练时节点保留率(keep probab ...

  7. 【33.00%】【vijos P1002】过河

    描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上 ...

  8. tcl/tk 调用选择路径的窗口

    tk_chooseDirectory -title "选择工作空间" -initialdir "D:\\" -title 指定打开后显示的title -init ...

  9. Codeforces 444A DZY Loves Physics(图论)

    题目链接:Codeforces 444A DZY Loves Physics 题目大意:给出一张图,图中的每一个节点,每条边都有一个权值.如今有从中挑出一张子图,要求子图联通,而且被选中的随意两点.假 ...

  10. CUDA—使用GPU暴力破解密码

    GPU支持大规模的并行加速运算,胜在量上,CPU处理大量的并行运算显得力不从心,它是胜在逻辑上.利用显卡加速的应用越来越多,但如果说GPU即将或最终将替代CPU还有点言过其实,二者最终将优势互补,各尽 ...