2016-11-03 11 views
-1

私はカスタムボタンを持っており、ボタンの状態が押された/クリックされたときに暗い色/影/背景色を削除したいので、すでにボタンの背景色と一致しています。だから誰もそれを押したようには見えませんが、それにはまだクリックイベントが付いています。ボタンを押し下げたときの背景色を変更するにはどうすればよいですか?

私はXamarin.Forms Androidのためにどうすればいいのだろうかと思っていましたか?

私はすでにカスタムレンダラを設定しているが、私はそれがダウン状態でその色になるだろう

Control.SetBackgroundColor(Color, ButtonState.Down) 

ようなものが必要。 Idk、Android用にこれを行う方法があれば?

また、私は自分の見解にC#を使用しています。

答えて

0

通常、StateListDrawableを使用して、各状態を1つのDrawableに定義し、その状態をButtonの背景として割り当てます。

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/pressed_img" android:state_pressed="true"/> 
    <item android:drawable="@drawable/hovered_img" android:state_hovered="true"/> 
    <item android:drawable="@drawable/focused_img" android:state_focused="true"/> 
    <item android:drawable="@drawable/default_img"/>  
</selector> 

次に、あなたのレイアウトのボタンにこの描画可能に割り当てます:

<Button 
    ... 
    android:background="@drawable/statelistdrawable" /> 

あなたがすることができます。各状態に異なる画像を使用して、このようなXML描画可能を定義し

また、C#でこれを作成してください:

var myButton = new Button(this); 
myButton.Background = drawable; 

状態がボタンに反映されるはずです。

+0

ちょうど考え出し中にエラー、あなたは何を意味するのか。もう一つの質問ですが、私のdrawableはイメージではなく色になりますか?そして、もし私のボタンの色が、それが現在のページの背景色になりたいのであれば...それは動的な色のようなものですか?これはうまくいかないでしょう。ありがとう! –

+0

@Cheesebaron - 答えはXamarinフォームではなく、Android用のXamarinのようです。これは質問が求めるものですか?もしそうなら、Xamarin.Formsタグを削除する必要があります。 –

+0

彼はAndroidタグを持っています。したがって、Androidの答え。彼はカスタムレンダラーを持っていると言います。そのため、カスタムレンダラーでこのコードを使用して目的の効果を得ることができます。 – Cheesebaron

0

Xamarin Forumのリンクhereからコードを試しましたか?私は個人的にそれを試していないが、それはあなたが動的な色を使用することを含めて欲しいものをするために使用することができるように見えます。たぶん、このような何か(私はメモリからコードの一部を書いたので、それが動作しない場合は私に知らせて):

フォーム:

public class FancyButton : Button { 

    /// <summary> 
    /// The color pressed down color property. 
    /// </summary> 
    public static readonly BindableProperty PressedDownColorProperty = BindableProperty.Create(nameof(PressedDownColor), typeof(Color), typeof(FancyButton), default(Color)); 

    /// <summary> 
    /// Gets or sets the pressed down color. 
    /// </summary> 
    /// <value>The color to change to when the button is pressed down string.</value> 
    public Color PressedDownColor { 
     get { return (Color)GetValue(PressedDownProperty); } 
     set { SetValue(PressedDownProperty, value); } 
    } 
} 

ドロイド:

[assembly: ExportRenderer(typeof(App2.FancyButton), typeof(FancyButtonAndroid))] 
namespace App2.Droid { 

    public class FancyButtonAndroid : ButtonRenderer { 

     private Color _pressedDownColor; 

     protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e) { 

      base.OnElementChanged(e); 
      Android.Widget.Button thisButton = Control as Android.Widget.Button; 

      FancyButton formsButton = (FancyButton)Element; 

      _pressedDownColor = formsButton.PressedDownColor; 

      thisButton.Touch += (object sender, Android.Views.View.TouchEventArgs e2) => { 
       if (e2.Event.Action == MotionEventActions.Down) { 
        thisButton.SetBackgroundColor(_pressedDownColor.ToAndroid()); 
       } else if (e2.Event.Action == MotionEventActions.Up) { 
        thisButton.SetBackgroundColor(Xamarin.Forms.Color.Default.ToAndroid()); 
       } 
      }; 
     } 

     /// <summary> 
     /// Raises the element property changed event. 
     /// </summary> 
     /// <param name="sender">Sender</param> 
     /// <param name="e">The event arguments</param> 
     protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { 
      base.OnElementPropertyChanged(sender, e); 

      FancyButton formsButton = Element as FancyButton; 

      if(formsButton != null && e.PropertyName == FancyButton.PlaceholderProperty.PropertyName) { 
       _pressedDownColor = formsButton.PressedDownColor; 
      } 
     } 
    } 
} 
関連する問題