日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 – 带六边形触摸区域的六角形按钮的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。