Android不规则点击区域详解

直接上代码:

1.demo代码,DemoActivity.java

 1 package com.test.activity;
 2
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.view.View;
 6 import android.view.View.OnClickListener;
 7 import android.widget.Toast;
 8
 9 import com.test.R;
10
11 public class DemoActivity extends Activity implements OnClickListener {
12
13     private Toast mToast;
14
15     @Override
16     protected void onCreate(Bundle savedInstanceState) {
17         super.onCreate( savedInstanceState);
18         setContentView( R.layout.activity_main);
19         findViewById( R.id.menu_1).setOnClickListener( this);
20         findViewById( R.id.menu_2).setOnClickListener( this);
21         findViewById( R.id.menu_3).setOnClickListener( this);
22         findViewById( R.id.menu_4).setOnClickListener( this);
23     }
24
25
26     @Override
27     public void onClick(View v) {
28         if(null != mToast) {
29             mToast.cancel();
30         }
31         switch(v.getId()) {
32             case R.id.menu_1:
33                 mToast = Toast.makeText( this, "red", Toast.LENGTH_SHORT);
34                 break;
35             case R.id.menu_2:
36                 mToast = Toast.makeText( this, "yellow", Toast.LENGTH_SHORT);
37                 break;
38             case R.id.menu_3:
39                 mToast = Toast.makeText( this, "green", Toast.LENGTH_SHORT);
40                 break;
41             case R.id.menu_4:
42                 mToast = Toast.makeText( this, "blue", Toast.LENGTH_SHORT);
43                 break;
44         }
45         mToast.show();
46     }
47 }

2.自定义控件代码,MenuViewItem.java

 1 package com.test.view;
 2
 3 import android.content.Context;
 4 import android.graphics.Bitmap;
 5 import android.graphics.Color;
 6 import android.graphics.drawable.BitmapDrawable;
 7 import android.graphics.drawable.Drawable;
 8 import android.graphics.drawable.StateListDrawable;
 9 import android.util.AttributeSet;
10 import android.view.MotionEvent;
11 import android.widget.FrameLayout;
12
13 public class MenuViewItem extends FrameLayout {
14
15
16
17     private int width = -1;
18
19     private int height = -1;
20
21     private Bitmap bitmap;
22
23
24
25     public MenuViewItem(Context context) {
26
27         super( context);
28
29     }
30
31
32
33     public MenuViewItem(Context context, AttributeSet attrs, int defStyle) {
34
35         super( context, attrs, defStyle);
36
37     }
38
39
40
41     public MenuViewItem(Context context, AttributeSet attrs) {
42
43         super( context, attrs);
44
45     }
46
47
48
49     @Override
50
51     public boolean onTouchEvent(MotionEvent event) {
52
53         int action = event.getAction();
54
55         if(action != MotionEvent.ACTION_DOWN) {
56
57             return super.onTouchEvent( event);
58
59         }
60
61         int x = (int)event.getX();
62
63         int y = (int)event.getY();
64
65         if(width == -1 || height == -1) {
66
67             Drawable drawable = ((StateListDrawable)getBackground()).getCurrent();
68
69             bitmap = ((BitmapDrawable)drawable).getBitmap();
70
71             width = getWidth();
72
73             height = getHeight();
74
75         }
76
77         if(null == bitmap || x < 0 || y < 0 || x >= width || y >= height) {
78
79             return false;
80
81         }
82
83         int pixel = bitmap.getPixel( x, y);
84
85         if(Color.TRANSPARENT == pixel) {
86
87             return false;
88
89         }
90
91         return super.onTouchEvent( event);
92
93     }
94
95 }

3.xml界面代码,activity_main.xml

 1 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="fill_parent"
 4     android:layout_height="fill_parent"
 5     android:gravity="center"
 6     android:orientation="vertical" >
 7
 8     <com.test.view.MenuViewItem
 9         android:id="@+id/menu_1"
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content"
12         android:layout_gravity="center"
13         android:background="@drawable/chrome_1" />
14
15     <com.test.view.MenuViewItem
16         android:id="@+id/menu_2"
17         android:layout_width="wrap_content"
18         android:layout_height="wrap_content"
19         android:layout_gravity="center"
20         android:background="@drawable/chrome_2" />
21
22     <com.test.view.MenuViewItem
23         android:id="@+id/menu_3"
24         android:layout_width="wrap_content"
25         android:layout_height="wrap_content"
26         android:layout_gravity="center"
27         android:background="@drawable/chrome_3" />
28
29     <com.test.view.MenuViewItem
30         android:id="@+id/menu_4"
31         android:layout_width="wrap_content"
32         android:layout_height="wrap_content"
33         android:layout_gravity="center"
34         android:background="@drawable/chrome_4" />
35
36 </FrameLayout>

4.图片控件代码,chrome_1.xml

1 <?xml version="1.0" encoding="utf-8"?>
2 <selector xmlns:android="http://schemas.android.com/apk/res/android">
3
4     <item android:drawable="@drawable/chrome_1_s" android:state_pressed="true"/>
5     <item android:drawable="@drawable/chrome_1_n"/>
6
7 </selector>

5.图片资源:

时间: 2024-08-03 23:26:27

Android不规则点击区域详解的相关文章

Android触摸屏事件派发机制详解与源码分析三(Activity篇)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 该篇承接上一篇<Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)>,阅读本篇之前建议先阅读. 1 背景 还记得前面两篇从Android的基础最小元素控件(View)到ViewGroup控件的触摸屏事件分发机制分析吗?你可能看完会有疑惑,View的事件是ViewGro

Android 动画(anim)详解

Android 动画(anim)详解 就我所知,简单阐述一下: Android的animation由四种类型组成:alpha(透明度).scale(缩放).translate(位移).rotate(旋转) XML配置文件中 android:alpha 渐变透明度动画效果 android:scale 渐变缩放动画效果 android:translate 画面转换位置移动动画效果 android:rotate 画面转移旋转动画效果 Java Code代码中 AlphaAnimation 渐变透明度动

Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送

Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送,写这个系列真的很要命,你要去把他们的API文档大致的翻阅一遍,而且各种功能都实现一遍,解决各种bug各种坑,不得不说,极光推送真坑,大家使用还是要慎重,我们看一下极光推送的官网 https://www.jpush.cn/common/ 推送比较使用,很多软件有需要,所以在这个点拿出来多讲讲,我们本节

Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)

1 背景 还记得前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事件疑惑吗?当时说了,在那一篇咱们只讨论View的触摸事件派发机制,这个疑惑留在了这一篇解释,也就是ViewGroup的事件派发机制. PS:阅读本篇前建议先查看前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>,这一篇承接上一篇. 关于View与ViewGroup的区别在前一篇的A

Android开发之通知栏Notification详解

Notification的用法  --- 状态栏通知 发送一个状态栏通知必须的两个类: 1. NotificationManager   --- 状态栏通知的管理类,负责发通知,清除通知等 NotificationManager : 是一个系统Service,必须通过 context.getSystemService(NOTIFICATION_SERVICE)方法获取 NotificationManager notificationManager = (NotificationManager)

【Android】Android软件开发之ListView 详解

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://xys289187120.blog.51cto.com/3361352/657171 ListView的使用方法 ListView是Android软件开发中非常重要组件之一,基本上是个软件基本都会使用ListView ,今天我通过一个demo来教大家怎么样使用ListView组件 绘制出漂亮的列表,说道ListView就不得不说Adapter适配器,因为只有通过Adapter才可

Android Design Support Library使用详解

Android Design Support Library使用详解 Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个support库里面,Google给我们提供了更加规范的MD设计风格的控件.最重要的是,Android Design Support Library的兼容性更广,直接可以向下兼容到Android 2.2.这不得不说是一个良心之作. 使用S

Android软件开发之TextView详解

Android软件开发之TextView详解<IGNORE_JS_OP> TextView的API 中文文档中 说明它的结构 结构java.lang.Object   android.view.View        android.widget.TextView直接子类:    Button, CheckedTextView, Chronometer, DigitalClock, EditText间接子类:     AutoCompleteTextView, CheckBox, Compou

Android Touch事件传递机制详解 下

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38025165 资源下载:http://download.csdn.net/detail/yuanzeyao2008/7660997 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在我想使用一个demo以及一个实例来学习一下Andorid中的Touch事件处理过程. 在Android系统中,和Touch事件分发和处理紧密相关的三个函数如下:(1) public