簡體   English   中英

Android中自定義形狀的按鈕 - 我做得對嗎?

[英]Custom shaped buttons in Android - Am I doing it right?

我正在嘗試實現四個自定義形狀的按鈕,如下圖所示:

在此輸入圖像描述

到目前為止我做了什么:我拍了4張不同的照片 - 每張照片只有一種顏色可見(見上文)。 圖像的另一部分是透明的。 結果是,我有四張相同尺寸的圖片。

現在我使用了相對布局,其中我的所有4張圖片都被添加到同一位置的圖像視圖中。 由於透明度,我可以看到所需的圖片。

對於我的ImageViews,我使用以下內容實現了onTouchListener:

private class ImageOnTouchListener implements View.OnTouchListener {
    private int categoryId;

    public ImageOnTouchListener(int categoryId) {
        this.categoryId = categoryId;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Bitmap bmp = Bitmap.createBitmap(v.getDrawingCache());
        int x = (int) event.getX();
        int y = (int) event.getY();
        boolean isInsideBitmap = x < bmp.getWidth() && y < bmp.getHeight() && x >= 0 && y >= 0;
        boolean isActionUp = event.getAction() == MotionEvent.ACTION_UP;
        if (isInsideBitmap) {
            int color = bmp.getPixel(x, y);
            bmp.recycle();
            if (color == Color.TRANSPARENT){
                return false;
            }
            else {
                if (isActionUp) {
                    buttonClick();
                }
            }
        }else{
            bmp.recycle();
        }
        return true;
    }
}

這種方法有效,但它消耗了大量內存,因為我在移動手指時總是創建一個位圖。 我不太確定這是否是實現這一目標的最佳方式。 有什么我可以做的不同可能導致更有效的方式嗎?

使用以下事實:當圓的中心為(0,0)時,您可以判斷坐標是否屬於具有等式x² + y² <= radius²的圓,我認為以下情況應該有效。

public class ImageOnTouchListener implements View.OnTouchListener {

    // TODO  Adjust this value
    private static int QUADRANT_RADIUS = 100; // in pixels
    // TODO  Adjust this value
    private static int SPACE_BETWEEN_QUADRANTS = 5; // in pixels

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int relativeX = (int) (event.getX() - v.getX());
        int relativeY = (int) (event.getY() - v.getY());
        int center = QUADRANT_RADIUS + (SPACE_BETWEEN_QUADRANTS / 2);

        boolean isInsideCircle = Math.pow(relativeX - center, 2) + Math.pow(relativeY - center, 2) <= Math.pow(center, 2);

        boolean isInsideBottomLeftQuadrant = isInsideCircle &&
                relativeX <= QUADRANT_RADIUS &&
                relativeY >= QUADRANT_RADIUS + SPACE_BETWEEN_QUADRANTS;
        boolean isInsideBottomRightQuadrant = isInsideCircle &&
                relativeX >= QUADRANT_RADIUS + SPACE_BETWEEN_QUADRANTS &&
                relativeY >= QUADRANT_RADIUS + SPACE_BETWEEN_QUADRANTS;
        boolean isInsideTopLeftQuadrant = isInsideCircle &&
                relativeX <= QUADRANT_RADIUS &&
                relativeY <= QUADRANT_RADIUS;
        boolean isInsideTopRightQuadrant = isInsideCircle &&
                relativeX >= QUADRANT_RADIUS + SPACE_BETWEEN_QUADRANTS &&
                relativeY <= QUADRANT_RADIUS;

        boolean isActionUp = event.getAction() == MotionEvent.ACTION_UP;

        if (isActionUp) {
            if (isInsideBottomLeftQuadrant) {
                // Handle bottom left quadrant click
                buttonClick();
                return true;
            } else if (isInsideBottomRightQuadrant) {
                // Handle bottom right quadrant click
            } // etc.
        }

        return false;
    }
}

您需要調整QUADRANT_RADIUSSPACE_BETWEEN_QUADRANTS值,然后從單個視圖處理所有觸摸事件(如我的代碼片段)或每個圖像的觸摸偵聽器略有不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM