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 模拟来电广播,在Andr
- 下一篇: android视频闪退,安卓 app 视