2011-05-16 175 views
0

我在我的Android應用程序中創建了一個具有基本上兩種不同視圖的自定義按鈕。有一個圖像用於未按下按鈕時的圖像和正在按下時使用的另一個圖像。以下是我如何實現按鈕以及它如何響應用戶。Android - 自定義按鈕卡住「按下」

private void registerListeners() { 

    calcButton.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      calcButton.requestFocusFromTouch(); 
      calcButton.setImageResource(R.drawable.calc_button_pressed); 
      return false; 
     } 
    }); 

    calcButton.setOnFocusChangeListener(new View.OnFocusChangeListener() { 

     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      calcButton.setImageResource(R.drawable.calc_button_not_pressed); 
     } 
    }); 

    calcButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) {   
      mathCalculation(); 
      calcButton.setImageResource(R.drawable.calc_button_not_pressed); 
     } 
    }); 
} 

我的問題是,有一個「錯誤」,其中,如果用戶觸摸鍵並拖動他們的身影離按鈕,按鈕停留按下。我上面實現的一個解決方案是「setOnFocusChangeListener」,所以一旦用戶選擇了它,它會彈出。

我想擁有它,當用戶在那裏觸摸按鈕時,按鈕彈出。

所有的建議都非常感謝!

謝謝,

+0

P.s ...如果任何人想看到在行動中發生的事情,只需在android市場中搜索myProfit。這將是唯一的應用程序彈出。 – KevinM 2011-05-16 19:34:15

回答

4

你並不需要寫一個單獨的按鈕類來獲得這種行爲,可以通過繪製XML實現它。有這個在你的XML,並將其設置爲背景爲您的按鈕:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" 
     android:drawable="@drawable/calc_button_pressed" /> 
    <item android:drawable="@drawable/calc_button_not_pressed" /> 
</selector> 
+0

嗯。我不知道如何實現這一點。大約一個月前我剛剛開始爲android開發,還有很多東西需要學習。何時何地實現可繪製的xml? 對於成爲這樣的noob感到抱歉。 – KevinM 2011-05-18 01:07:45

+0

好吧,我想出瞭如何使用它。我在hdpi文件夾中創建了可繪製的xml。我把它叫做calc_button,我在我的「setOnTouchListener」中調用它。它非常完美! 雖然我有一個問題。我是否需要在mdpi和ldpi文件夾中創建相同的可繪製xml? – KevinM 2011-05-18 01:21:32

+0

嘿凱文,很高興它的工作。你不應該這樣做,因爲根據http://developer.android.com/guide/topics/resources/localization.html的'drawable'資源文件夾是唯一一個'神奇地'可以從各種文件夾,而不必聲明「默認」值。否則,爲了安全起見,您可以將您在'drawable'文件夾下創建的xml文件從'drawable-hdpi'中移除。閱讀我發給您的本地化鏈接,它解釋了爲不同資源文件夾使用配置的原因。 – Gix 2011-05-18 01:28:49

1

你可以使用使用onTouch。然後使用用戶觸摸移出視圖邊界時觸發的ACTION_OUTSIDE

編輯1:更具體:

OnTouchListener(MotionEvent e) { 
    switch(e.getAction()) { 
     case MotionEvent.ACTION_OUTSIDE: // switch the image if the button 
    } 
} 
1

這是因爲點擊事件「發生」接觸和時才釋放。如果你觸摸並移動到外面,那不是點擊。

要做你想要的東西使用StateListDrawable,它就是爲了做到這一點。