自定义控件 imageview 双击显示红色边框

在项目中用到了一个如下功能:双击自定义imageview控件,然后控件显示一个红色边框,表示该控件处于可编辑状态,再次双击边框消失,控件不可再被编辑。现把双击和画线部分单独摘出来,希望能帮到别人。

首先是自定义控件的代码:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.ImageView;

public class MyImageView extends ImageView {

	private boolean isDisplay = false;//是否显示边框
	private int imgId;//序列属性

	/** 构造方法 **/
	public MyImageView(Context context) {
		super(context);
	}

	public MyImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	/**编辑状态下图片周围画一圈红线**/
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		if (isDisplay) {
			Paint paint = new Paint();
			paint.setColor(android.graphics.Color.RED);//线条颜色
			paint.setStrokeWidth(3);//线条宽度

			/** 画四条线 **/
			canvas.drawLine(0, 1, this.getWidth() - 1, 1, paint);
			canvas.drawLine(1, 0, 1, this.getHeight() - 1, paint);
			canvas.drawLine(this.getWidth() - 2, 0, this.getWidth() - 2,
					this.getHeight() - 1, paint);
			canvas.drawLine(0, this.getHeight() - 2, this.getWidth() - 1,
					this.getHeight() - 2, paint);
		}
	}

	/** 设定边框是否显示 **/
	public void setDisplayable(boolean isEditable) {
		this.isDisplay = isEditable;
		postInvalidate();//调用onDraw,重新画线
	}

	/** 获取边框是否显示 **/
	public boolean getDisplayable() {
		return isDisplay;
	}

	/** 设定图片ID **/
	public void setimgId(int img_ID) {
		this.imgId = img_ID;
	}

	/** 获取图片ID **/
	public int getimgId() {
		return imgId;
	}
}

比较简单,画线是在onDraw方法中实现的,postInvalidate方法可以调用onDraw方法,每次更改isDisplay时都需要重新画线。

下面是主程序代码:

import view.MyImageView;
import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class MainActivity extends Activity {
	private MyImageView img1, img2, img3;
	private MyImageView imgArray[] = { img1, img2, img3 };
	private int imgNum = 3;//图片数量
	private int currentId,lastId = 4;//当前图片标识和上次操作的图片标识
	private GestureDetector mGestureDetector;// 双击手势监器
	private ImgClickListener imgClicklistener = new ImgClickListener();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mGestureDetector = new GestureDetector(MainActivity.this,
				new LearnGestureListener());
		imgArray[0]=(MyImageView)findViewById(R.id.myImageView1);
		imgArray[1]=(MyImageView)findViewById(R.id.myImageView2);
		imgArray[2]=(MyImageView)findViewById(R.id.myImageView3);

		for(int i=0;i<imgNum;i++){
			imgArray[i].setimgId(i);
			imgArray[i].setOnTouchListener(imgClicklistener);
			imgArray[i].setClickable(true);//允许双击操作(必须要有)
		}
	}

	/* 单击操作监听 */
	private class ImgClickListener implements OnTouchListener {
		@Override
		public boolean onTouch(View v, MotionEvent event) {
			switch (event.getAction() & MotionEvent.ACTION_MASK) {
			case MotionEvent.ACTION_DOWN:
				currentId = ((MyImageView) v).getimgId();// 获取当前操作图片的ID
				break;
			}
			mGestureDetector.onTouchEvent(event);// 执行双击手势操作
			return false;
		}
	}

	/* 双击操作监听 */
	class LearnGestureListener extends GestureDetector.SimpleOnGestureListener {
		@Override
		public boolean onDoubleTap(MotionEvent arg0) {
				if (lastId != currentId) {

					/** 同一图片在可编辑和不可编辑状态切换 **/

					for (int i = 0; i < imgNum; i++) {
						imgArray[i].setDisplayable(false);
					}
					imgArray[currentId].setDisplayable(true);
					lastId = currentId;
				} else {

					/** 不同图片在可编辑和不可编辑状态切换**/
					if (imgArray[currentId].getDisplayable()) {
						for (int i = 0; i < imgNum; i++) {
							imgArray[i].setDisplayable(false);
						}
					} else {
						for (int i = 0; i < imgNum; i++) {
							imgArray[i].setDisplayable(false);
						}
						imgArray[currentId].setDisplayable(true);
					}

				}
			return false;
		}
	}
}

基本原理比较简单,就是把所有的控件都存在数组中,这样的话很多操作通过遍历就可以实现,比较方便。初始化的时候给每一个图片一个唯一的ID,在程序运行中通过该ID来识别操作的图片是哪一个。在执行双击操作时首先会有一个ACTION_DOWN的操作,在这个操作执行的时候先把当前操作的图片的ID记录在currentId变量中,然后在双击操作执行的时候比较该ID和lastId变量,再进行相应的操作。

我的程序是在平板中实现的,跟在手机中实现的原理是完全一样的,有问题可以留言

源代码下载链接:点击打开链接 http://download.csdn.net/detail/yxg190221/7551473

自定义控件 imageview 双击显示红色边框

时间: 2024-10-12 07:03:17

自定义控件 imageview 双击显示红色边框的相关文章

eclipse平台 android项目前显示红色叉号 android level-19 4.4平台导入项目 问题解决办法

android level-19  4.4平台导入项目 项目前显示红色叉号  问题解决办法 android level-19  4.4平台导入项目 项目前显示红色叉号,检查项目中文件,文件前没有叉号,分析是项目导入的问题,或者是lib库配置的问题. 1.用eclipse建立一个简单的android项目, HelloWorld: 2.选择HelloWorld项目,鼠标右键选择Build Path-Configure Build Path 对比发现,没有勾选 Android 4.4. 2.选择导入的

解决方案:Resharper对系统关键字提示‘can not resolve symbol XXX’,并且显示红色,但是编译没有问题

?? 环境:Visual studio 2013 community Update 4 + Resharper 8.2 + Windows 7 现象: 我的C#工程编译没有问题, 但是在代码编辑器中系统关键字显示红色, 提示系统关键字提示'can not resolve symbol XXX'. 比如Linq相关的Where.Take.Skip等关键字, 比如EF相关的AsNoTracking等等. 解决方案可以尝试下面几个: (1)打开VS/Tools/Options/Resharper/Ge

DedeCms最新文章显示红色日期或加上new字或new小图片

DedeCMS发布的文章显示红色日期或加上new字或new小图片,给近三天(或当天)发布的文章显示红色日期或加上new字或new小图片等,都是围绕pubdate做文章,写扩展的. 1.红色的日期   [field:pubdate runphp='yes'] $a="<font color=red>".strftime('%m-%d',@me)."</font>"; $b=strftime('%m-%d',@me); $ntime = time

intellj打开java项目后文件名显示红色

用intellj打开java项目后文件名显示红色 原因: 使用了版本控制工具导致 解决办法: 打开项目下的.idea文件夹,找到其中的vcs.xml打开,将<mapping directory="" vcs="" />中的vcs的值清空即可

Android ImageView 不显示JPEG图片 及 Android Studio中怎样引用图片资源

Android ImageView 不显示JPEG图片 今天在写一个小实例,ImageView在xml里面设置的是INVISIBLE,在代码里须要设置成setVisibility(View.VISIBLE),但图片没有显示出来,换成PNG或其他的JPEG格式的图片确能够正常的显示. 原因:显示的图片大小为5.39K,图片格式有损坏,所以不能正常显示. 解决:换一张图片.或又一次生成JPEG图片. 假设还是不能正常显示,建议在设置完VISIBLE后,调用例如以下方法: iv.setVisibili

Android ImageView 不显示JPEG图片 及 Android Studio中如何引用图片资源

Android ImageView 不显示JPEG图片 今天在写一个小实例,ImageView在xml里面设置的是INVISIBLE,在代码里需要设置成setVisibility(View.VISIBLE),但图片没有显示出来,换成PNG或其它的JPEG格式的图片确可以正常的显示. 原因:显示的图片大小为5.39K,图片格式有损坏,所以不能正常显示. 解决:换一张图片,或重新生成JPEG图片. 如果还是不能正常显示,建议在设置完VISIBLE后,调用如下方法: iv.setVisibility(

CSS实现鼠标放图片上显示白色边框+文字描述

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

鼠标悬停时显示图片边框和文字描述的图片特效

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ

使用IDEA工具整合mybatis时使用@Resource和@Autowired自动注解bean时会显示红色问题的解决办法

使用IDEA工具整合mybatis时使用@Resource和@Autowired自动注解bean时会显示红色问题的解决办法 idea中springboot整合mybatis时,通过@Autowired注入的对象一直有下划线提示,但是项目能运行,虽然不影响运行,但是强迫症的程序员肯定看不下去. 如何去除呢?解决:改变@Autowired的检查级别即可.快捷键:Ctrl+Alt+s,进入idea设置界面,输入inspections检索,如下: 原文地址:https://www.cnblogs.com