600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 自定义控件 imageview 双击显示红色边框

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

时间:2023-05-05 00:59:05

相关推荐

自定义控件 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();@Overrideprotected 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 {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN:currentId = ((MyImageView) v).getimgId();// 获取当前操作图片的IDbreak;}mGestureDetector.onTouchEvent(event);// 执行双击手势操作return false;}}/* 双击操作监听 */class LearnGestureListener extends GestureDetector.SimpleOnGestureListener {@Overridepublic 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变量,再进行相应的操作。

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

源代码下载链接:点击打开链接/detail/yxg190221/7551473

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。