android+六边形布局,android – 带六边形触摸区域的六角形按钮
好吧,事实证明这比我想象的要复杂得多.基本问题是最高的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 – 带六边形触摸区域的六角形按钮相关推荐
- android折叠布局,Android中FoldingLayout折叠布局的用法及实战全攻略
一.概述无意中翻到的FoldingLayout的介绍的博客,以及github地址.感觉很nice呀,于是花了点时间研究以及编写,本篇博客将带大家从最基本的原理分析,一步一步的实现我们的FoldingL ...
- android widget 布局,Android Widget Attributes——View
最近因为想着重新把这个插件捡起来,把view的属性慢慢的全部补上,所以顺便了解一下各个属性,在这里列举View的属性,含义,以及代码设置. 简书Markdown编辑器实在是渣,只能把表格换成下面这种形 ...
- android excel布局,Android实现仿excel数据表格效果
在没给大家分享代码之前,先给大家展示下效果图: 1.activity /** * 采购需求 * Created by Administrator on 2016/10/13. */ public cl ...
- Android系统布局——android.R.layout详解
布局文件,作为android中必不可少的一部分,android系统为了方便开发人员,在系统中定义了很多的布局文件. 系统布局文件和我们自定义的布局在写法用前缀android以示区别: 系统布局文件:a ...
- android侧滑布局,Android布局控件DrawerLayout实现完美侧滑效果
drawerLayout其实是一个布局控件,跟LinearLayout等控件是一样的,但是drawerLayout带有滑动的功能.只要按照drawerLayout的规定布局方式写完布局,就能有侧滑的效 ...
- android scrollview 布局,Android scrollview实现底部继续拖动查看图文详情
本文实例为大家分享了Android实现底部拖动查看图文详情的具体代码,供大家参考,具体内容如下 一.效果图 二.实现步骤 1.xml布局的实现/p> android:id="@+id/ ...
- android 闹钟布局,Android闹钟UI
股票闹钟应用程序是open source,所以请自行检查. 首选项布局见here: android:title="@string/set_alarm"> android:ti ...
- android 梅花布局,Android相对布局实现各种梅花效果
一.效果图如下: 第一部是往drawable文件夹里放一个图片名为icon.png的图片,首先在这里说明Android只能放扩展名为png.jpg.gif的图片: 然后编写main.xml文件,代码如 ...
- android 购物车布局,Android 加入购物车动画
做了一个加入购物车动画,代码比较简单,先看下效果,可能因录制git图片软件问题,录制的git图片有些卡顿,实际效果流畅性还是不错的. 代码很简单 首先布局文件: xmlns:tools="h ...
最新文章
- oracle 如何预估将要创建的索引的大小
- (筆記) 如何安裝Altera USB Blaster? (SOC) (Quartus II) (DE2)
- 华夏幸福发布2018年业绩简报 整体销售面积同比增57.56%
- linux源码安装nginx
- 在屏幕上输出你好的python语句是_编程实现:在屏幕上输出中文字符“你好,世界”。(输出结果中不带双引号)_学小易找答案...
- 电商平台 高并发 微服务 方案_Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战...
- 【数据竞赛】长文本竞赛上分的三种策略。
- 随时间的反向传播算法 BPTT
- OpenCV Stitching 工程搭建
- NetBeans中文乱码解决办法
- java编写管理系统_用java编写学生信息管理系统
- linux下使用yum安装Apache+php+Mysql+phpMyAdmin
- 毕设项目 - 基于SSM的药品管理系统(含源码+论文)
- eset杀毒软件隔离区在哪里
- 小程序全局悬浮窗_微信小程序中悬浮窗功能的实现代码
- CIBERSORT进行免疫细胞组成分析
- Android获取天气预报Demo
- C语言进阶-高阶指针
- JAVA修炼秘籍第四章《闭关修炼》
- 前端基本功---JS数据类型知多少
热门文章
- java的弱引用_深入理解Java中的弱引用
- python包怎么用_python的包怎么应用
- 微信小程序,引用扩展组件提示“没有找到可以构建的NPM包”
- Qt中的枚举变量,Q_ENUM,Q_FLAG,Q_NAMESPACE,Q_ENUM_NS,Q_FLAG_NS以及其他
- Windows下用命令行查找文件for命令的运用
- 生成msk文件的用处_Yotta企业云盘“小”功能大用处企业办公好伙伴
- vue项目多页面入口配置
- centos 7 升级/安装 git 2.7.3
- 重新学习的HTTP协议
- 网段:192.168.6.0的机器A要访问网段:10.1.56.0的机器B