2016-11-03 342 views
-1

我有一個自定義按鈕,當按下/單擊按鈕狀態時,我想刪除較深的顏色/陰影/背景顏色,所以它與按鈕的背景顏色相匹配。所以看起來沒有人按下它,但它仍然有一個點擊事件。按下/下按鈕時,如何更改按鈕的背景顏色?

我想知道我該怎麼做Xamarin.Forms Android?

我已經有一個自定義渲染設置,但我需要這樣的東西

Control.SetBackgroundColor(Color, ButtonState.Down) 

因此這將是在向下狀態的顏色。 Idk,如果有辦法爲Android做到這一點?

此外,我使用C#作爲我的觀點。

回答

0

通常情況下,您會爲此使用StateListDrawable,您可以在一個Drawable中定義每個狀態並將其指定爲Button的背景。

你會這樣定義一個XML繪製,採用了不同的圖像的每個狀態:

<?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" /> 

你可以也可以在C#中創建:

var drawable = new StateListDrawable(); 
drawable.AddState(new[] {Android.Resource.Attribute.StateFocused}, 
         Resources.GetDrawable(Resource.Drawable.focused)); 

然後將其設置爲背景:

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

狀態現在應該反映在按鈕上。

+0

哎呀,只是想出了你的意思是。還有一個問題,我的drawable可以是顏色而不是圖像嗎?如果我的按鈕的顏色,我希望它成爲當前頁面的背景顏色......所以它是一種動態顏色?這是行不通的。謝謝! –

+0

@Cheesebaron - 它看起來像你的答案是適用於Android的Xamarin,而不是Xamarin Forms。這是問題所要求的嗎?如果是這樣,我們需要刪除Xamarin.Forms標籤,當然? –

+0

他有Android標籤。因此Android的答案。他說他有一個自定義渲染器,因此他可以在自定義渲染器中使用此代碼來獲得所需的效果。 – Cheesebaron

0

您是否嘗試過Xamarin論壇鏈接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); } 
    } 
} 

的Droid:

[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; 
      } 
     } 
    } 
}