好吧,事实证明这比我想象的要复杂得多.基本问题是最高的Z-ordered按钮总是获得触摸事件,但是即使它没有处理事件,也不会在较低的Z-order上传递它.要获得两个按钮来查看事件,需要解决方法.这是基本方法:

1:在片段/活动中创建一个当前包含十六进制按钮的容器

2:创建一个包含按钮的片段,以及所有这些按钮和另一个按钮,其中alpha = 0

3:添加一个getOverlay():返回alpha = 0按钮的View方法

4:在片段中实现hitTest():Button方法

5:在主Activity / Fragment中,设置侦听器以处理叠加按钮的触摸事件

我制作(并测试了)一个应用程序来演示这个概念.我要把hitTest留给你,因为它相当乏味

activity_main.xml中:

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

android:paddingBottom="@dimen/activity_vertical_margin"

tools:context=".MainActivity">

android:layout_width="match_parent"

android:layout_height="match_parent"/>

fragment_buttons.xml:

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="com.example.me.testapplication.Buttons">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/lorem"/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/lorem_ipsum"

android:alpha="0.4"/>

android:layout_width="match_parent"

android:layout_height="match_parent"

android:alpha="0"/>

MainActivity.java:

public class MainActivity extends ActionBarActivity {

public static final String DEBUG_TAG = "TEST";

private Buttons mButtons;

private GestureDetector mGestureDetector;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mButtons = Buttons.newInstance();

getFragmentManager().beginTransaction()

.replace(R.id.main_container, mButtons)

.commit();

mGestureDetector = new GestureDetector(this, mGestureListener);

}

@Override

protected void onStart() {

super.onStart();

View overlay = mButtons.getOverlay();

if (overlay != null) {

overlay.setOnTouchListener(mTouchListener);

}

}

...

private View.OnTouchListener mTouchListener = new View.OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

return mGestureDetector.onTouchEvent(event);

}

};

private GestureDetector.OnGestureListener mGestureListener

=new GestureDetector.OnGestureListener()

{

@Override

public boolean onDown(MotionEvent e) {

String buttonHit = mButtons.hitTest(e);

Log.i(DEBUG_TAG, buttonHit);

return true;

}

...

};

}

Buttons.java:

public class Buttons extends Fragment {

Button mButton1, mButton2;

View mOverlay;

public static Buttons newInstance() {

return new Buttons();

}

public Buttons() {}

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

}

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

View root = inflater.inflate(R.layout.fragment_buttons, container, false);

mButton1 = (Button) root.findViewById(R.id.button1);

mButton2 = (Button) root.findViewById(R.id.button2);

mOverlay = root.findViewById(R.id.overlay);

return root;

}

@Nullable

public View getOverlay() {

return mOverlay;

}

public String hitTest(MotionEvent event) {

float x = event.getX();

float y = event.getY();

if (x > mButton1.getLeft() && mButton1.getRight() > x &&

y > mButton1.getTop() && mButton1.getBottom() > y)

{

return "Button 1";

} else if (x > mButton2.getLeft() && mButton2.getRight() > x &&

y > mButton2.getTop() && mButton2.getBottom() > y)

{

return "Button 2";

} else {

return "None";

}

}

}

祝好运.

ETA:样本hitTest

/**

* UNTESTED

* I'm going to assume square buttons (equilateral hexagons)

* this just calculates if the distance from the center of the button is less than its width. It may be good enough for government work.

*/

public View hitTest(MotionEvent e) {

for (Button hex : SomeIterableThingHoldingYourButtons) { //ArrayList maybe

float x = e.getX();

float y = e.getY();

if (isInHex(hex, x, y)) return hex;

}

return null;

}

private boolean isInHex(Button hex, float x, float y) {

float radius = hex.getRight() - hex.getLeft() / 2;

float centerX = hex.getLeft() + radius;

float centerY = hex.getTop() + radius;

float dist = FloatMath.sqrt(...) //euclidean distance

return dist < radius;

}

android+六边形布局,android – 带六边形触摸区域的六角形按钮相关推荐

  1. android折叠布局,Android中FoldingLayout折叠布局的用法及实战全攻略

    一.概述无意中翻到的FoldingLayout的介绍的博客,以及github地址.感觉很nice呀,于是花了点时间研究以及编写,本篇博客将带大家从最基本的原理分析,一步一步的实现我们的FoldingL ...

  2. android widget 布局,Android Widget Attributes——View

    最近因为想着重新把这个插件捡起来,把view的属性慢慢的全部补上,所以顺便了解一下各个属性,在这里列举View的属性,含义,以及代码设置. 简书Markdown编辑器实在是渣,只能把表格换成下面这种形 ...

  3. android excel布局,Android实现仿excel数据表格效果

    在没给大家分享代码之前,先给大家展示下效果图: 1.activity /** * 采购需求 * Created by Administrator on 2016/10/13. */ public cl ...

  4. Android系统布局——android.R.layout详解

    布局文件,作为android中必不可少的一部分,android系统为了方便开发人员,在系统中定义了很多的布局文件. 系统布局文件和我们自定义的布局在写法用前缀android以示区别: 系统布局文件:a ...

  5. android侧滑布局,Android布局控件DrawerLayout实现完美侧滑效果

    drawerLayout其实是一个布局控件,跟LinearLayout等控件是一样的,但是drawerLayout带有滑动的功能.只要按照drawerLayout的规定布局方式写完布局,就能有侧滑的效 ...

  6. android scrollview 布局,Android scrollview实现底部继续拖动查看图文详情

    本文实例为大家分享了Android实现底部拖动查看图文详情的具体代码,供大家参考,具体内容如下 一.效果图 二.实现步骤 1.xml布局的实现/p> android:id="@+id/ ...

  7. android 闹钟布局,Android闹钟UI

    股票闹钟应用程序是open source,所以请自行检查. 首选项布局见here: android:title="@string/set_alarm"> android:ti ...

  8. android 梅花布局,Android相对布局实现各种梅花效果

    一.效果图如下: 第一部是往drawable文件夹里放一个图片名为icon.png的图片,首先在这里说明Android只能放扩展名为png.jpg.gif的图片: 然后编写main.xml文件,代码如 ...

  9. android 购物车布局,Android 加入购物车动画

    做了一个加入购物车动画,代码比较简单,先看下效果,可能因录制git图片软件问题,录制的git图片有些卡顿,实际效果流畅性还是不错的. 代码很简单 首先布局文件: xmlns:tools="h ...

最新文章

  1. oracle 如何预估将要创建的索引的大小
  2. (筆記) 如何安裝Altera USB Blaster? (SOC) (Quartus II) (DE2)
  3. 华夏幸福发布2018年业绩简报 整体销售面积同比增57.56%
  4. linux源码安装nginx
  5. 在屏幕上输出你好的python语句是_编程实现:在屏幕上输出中文字符“你好,世界”。(输出结果中不带双引号)_学小易找答案...
  6. 电商平台 高并发 微服务 方案_Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战...
  7. 【数据竞赛】长文本竞赛上分的三种策略。
  8. 随时间的反向传播算法 BPTT
  9. OpenCV Stitching 工程搭建
  10. NetBeans中文乱码解决办法
  11. java编写管理系统_用java编写学生信息管理系统
  12. linux下使用yum安装Apache+php+Mysql+phpMyAdmin
  13. 毕设项目 - 基于SSM的药品管理系统(含源码+论文)
  14. eset杀毒软件隔离区在哪里
  15. 小程序全局悬浮窗_微信小程序中悬浮窗功能的实现代码
  16. CIBERSORT进行免疫细胞组成分析
  17. Android获取天气预报Demo
  18. C语言进阶-高阶指针
  19. JAVA修炼秘籍第四章《闭关修炼》
  20. 前端基本功---JS数据类型知多少

热门文章

  1. java的弱引用_深入理解Java中的弱引用
  2. python包怎么用_python的包怎么应用
  3. 微信小程序,引用扩展组件提示“没有找到可以构建的NPM包”
  4. Qt中的枚举变量,Q_ENUM,Q_FLAG,Q_NAMESPACE,Q_ENUM_NS,Q_FLAG_NS以及其他
  5. Windows下用命令行查找文件for命令的运用
  6. 生成msk文件的用处_Yotta企业云盘“小”功能大用处企业办公好伙伴
  7. vue项目多页面入口配置
  8. centos 7 升级/安装 git 2.7.3
  9. 重新学习的HTTP协议
  10. 网段:192.168.6.0的机器A要访问网段:10.1.56.0的机器B