自定义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 ...
随机推荐
- Xcode7 不能使用http网络请求问题解决
最近使用Xcode 7.0 写代码,发送网路请求提示: App Transport Security has blocked a cleartext HTTP (http://) resource ...
- Identifying a distributed denial of service (DDOS) attack within a network and defending against such an attack
The invention provides methods, apparatus and systems for detecting distributed denial of service (D ...
- Erlang/OTP 中文手册
http://erldoc.com/ Open Telecom Platform application array asn1rt base64 binary calendar code dbg di ...
- GANs(生成对抗网络)初步
Image Completion with Deep Learning in TensorFlow 1. 基本思路 首先定义一个简单的.常见的概率分布,将其表示为 pz,不妨将其作为 [-1, 1] ...
- CORDOVA :添加cordova-plugin-file-opener2插件cordova打包报错
原文:CORDOVA :添加cordova-plugin-file-opener2插件cordova打包报错 最近在接触android项目,其中涉及到APP自动更新的问题,当新APP下载成功后需要打开 ...
- effective c++ 条款7
1.随着多态基类应该声明一个质virtual析构函数. 假定class由于不管是什么virtual析构函数, 它应该有一个virtual析构函数. 2.classed的设计目的假设不是作为base c ...
- this解析
定时器中的this function Aaa() { var _this = this; //解决关键 this.a = 12; //但凡被定时器调的函数,this必然是window,所以,show里 ...
- Python3.7环境配置
1.官网下载 https://www.python.org/ 我这是3.7.0 for windows executable installer Download Windows x86 web-ba ...
- 使用JScript编译指定目录下所有工程
作者:朱金灿 来源:http://blog.csdn.net/clever101 我遇到这样一个问题:在一个插件工程目录下的插件工程越来越多,因此通过建一个解决方案然后把新增加的工程逐个添加进解决方案 ...
- android点击屏幕隐藏小键盘
原文:android点击屏幕隐藏小键盘 fragment 下隐藏点击空白处隐藏小键盘 view.setOnTouchListener(new OnTouchListener() { @Overri ...