2011-05-16 132 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,它就是为了做到这一点。