2015-04-05 88 views
1

我正在嘗試創建一個具有相當複雜的用戶界面的應用程序。 我想了解什麼是最好的做法,呈現不規則的按鈕形狀到屏幕上。呈現不規則的按鈕形狀 - 最佳做法

我以添加此圖像爲例。這些木板中的每一個都是一個按鈕。 我顯然不能使用Android的Button或ImageButton,因爲這個形狀不是矩形。

我認爲我需要直接在畫布上繪製或使用onDraw或Draw來實現這一點。 這是我應該用這些按鈕渲染的正確方法嗎? 這些任何一個優秀的閱讀材料是高度讚賞..

謝謝

enter image description here

+2

我認爲你是對的,最好不要使用按鈕 - 它應該是你自己的定製控件,用於所有3個項目和處理觸摸事件以決定哪個按下。 – Mixaz 2015-04-05 09:17:58

+1

代碼示例:http://stackoverflow.com/questions/6756806/android-drawing-on-touch-event – Mixaz 2015-04-05 09:21:01

+0

謝謝你的回覆!所以它看起來。他正在加載位圖,使用onDraw繪製它並使用onTouchEvent來處理觸摸事件。所以實質上,位圖周圍的邊界框會跟隨位圖中的像素?或者它是一個矩形邊界框,並且具有透明度的區域也將是觸發觸摸事件的區域? – 2015-04-05 10:09:59

回答

1

您可以創建自定義視圖以下列方式工作:

onDraw()油漆
  1. 每3位圖代表單個按鈕(其中2個其他按鈕是透明的),
  2. in onTouch()檢查觸摸像素對t軟管的位圖,看看哪個位圖被點擊

代碼片段:

public class DrawingBoard extends View { 

    Bitmap mBitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.button1); 
    Bitmap mBitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.button2); 
    Bitmap mBitmap3 = BitmapFactory.decodeResource(getResources(), R.drawable.button3); 

    public DrawingBoard (Context context) { 
     // TODO Auto-generated constructor stub 
     super (context);    
    } 
    @Override 
    protected void onDraw (Canvas canvas) { 
     canvas.drawBitmap(mBitmap1, 0, 0, null); 
     canvas.drawBitmap(mBitmap2, 0, 0, null); 
     canvas.drawBitmap(mBitmap3, 0, 0, null); 
    } 
    @Override 
    public boolean onTouchEvent (MotionEvent event) { 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN : 
       int xx = (int)event.getX(); 
       int yy = (int)event.getY(); 
       if(Color.alpha(mBitmap1.getPixel(xx,yy)) != 0) { 
        // button1 pressed 
       } 
       else if(Color.alpha(mBitmap2.getPixel(xx,yy)) != 0) { 
        // button2 pressed 
       } 
       else if(Color.alpha(mBitmap3.getPixel(xx,yy)) != 0) { 
        // button3 pressed 
       } 
       break; 
     } 

     return true; 

    } 
@Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
    { 
    // bitmaps are assumed to be of the same size 
    setMeasuredDimension(mBitmap1.getWidth(),mBitmap1.getHeight()); 
    }  
} 

我沒有測試的代碼,它可能有誤差。

一個變體 - 你可以創建一個虛擬位圖存儲整個圖像像素的「點擊代碼」。您可以從原始圖片創建它,但用id替換像素以檢測哪個區域被觸摸,所有其他像素都爲空(0x0)。所以getPixel()將返回一個按鈕的ID。