标签:float private event 点击 ACTION ImageView Android public View
有些场景,需要一张图片部分可点击,这样就需要自己提前确定可响应点击范围。
这里以ImageView 为例,讲一下部分可点击事件。
看下效果:
我这里一张顶部图片,有个输入框元素,如果元素要一个个叠加的话,会比麻烦,直接用一张图片做背景就比较省事,只要处理下 只响应输入框这一部分的点击效果。
首先布局文件中:
<com.xxx.widget.PartClickImageView
android:clickable="true"
android:id="@+id/view_top_bg"
android:layout_width="match_parent"
android:layout_height="185dp"
android:background="@drawable/bg_main_tab_top" />
ImageView 通过重写 onTouchEvent 在ACTION_DOWN、ACTION_MOVE、ACTION_UP、ACTION_CANCEL中判断是否满足条件,满足条件可点击,否则不可响应点击效果。
public class PartClickImageView extends ImageView {
private float x;//点击范围的左上角距离屏幕左侧的宽度
private float y;//点击范围的左上角距离屏幕顶部的高度
private float width;//点击范围的宽度
private float height;//点击范围的高度
private boolean clickable = false;
//点击事,如果移动范围在可接受范围内,可以响应点击事件
private int acceptRange = 0;
private OnRangeClickListener onRangeClickListener;
public void setOnRangeClickListener(OnRangeClickListener onRangeClickListener) {
this.onRangeClickListener = onRangeClickListener;
}
//向外暴露的方法设置ImageView的点击范围
public void setClickRange(float x, float y, float width, float height,int range) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
acceptRange = range;
}
public PartClickImageView(Context context) {
super(context);
}
//给自定义的View设置点击事件
public PartClickImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public PartClickImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
float downX=0f,downY=0f;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: //0
downX = event.getX();
downY = event.getY();
clickable = true;
break;
case MotionEvent.ACTION_MOVE://2
float tempX = event.getX();
float tempY = event.getY();
if(Math.abs(tempX-downX)>acceptRange||Math.abs(tempY-downY)>acceptRange){
clickable = false;
}
break;
case MotionEvent.ACTION_UP://1
float currentX = event.getX();
float currentY = event.getY();
if (clickable&¤tX > x && currentX < (x + width) && currentY > y && currentY < (y + height)) {
//在点击范围内,触发点击事件
onRangeClickListener.onClickImage(this);
}
break;
case MotionEvent.ACTION_CANCEL://3
clickable = false;
break;
return super.onTouchEvent(event);
}
//重新定义图片的点击事件
public interface OnRangeClickListener {
void onClickImage(View view);
}
}
使用:
float x = 20*ScreenUtil.getScreenWidth()/360;
float y = 110*ScreenUtil.getScreenWidth()/360;
float width = ScreenUtil.getScreenWidth() - 2*x;
float height = 50*ScreenUtil.getScreenWidth()/360;
//设置点击区域
holder.mViewTopBg.setClickRange(x,y ,width,height,0);
holder.mViewTopBg.setOnRangeClickListener(new PartClickImageView.OnRangeClickListener() {
@Override
public void onClickImage(View view) {
}
});
如果你也热衷技术欢迎加群一起进步:230274309 。 一起分享,一起进步!少划水,多晒干货!!欢迎大家!!!(进群潜水者勿加) |
点击链接加入群聊【编程之美】:https://jq.qq.com/?_wv=1027&k=h75BfFCg
或者扫码
标签:float,private,event,点击,ACTION,ImageView,Android,public,View 来源: https://blog.csdn.net/u011733020/article/details/113922669
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。