Xamarin.Android Как программно установить волновой эффект при любом просмотре? - PullRequest
0 голосов
/ 04 мая 2018

Впервые задаю вопрос здесь, поэтому давайте посмотрим ...

У меня проблемы с программной настройкой эффекта ряби на CardView. (Но я надеюсь найти способ, который работает в основном при любом виде). ​​Дело в том, что мои карты сделаны программно следующим образом:

...
        //make cardview
        CardView result = new CardView(Activity);
        //set layout
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0, 100, 1f);
        layoutParams.SetMargins(10, 10, 10, 10);
        result.LayoutParameters = layoutParams;
        result.Tag = itemId.ToString();

        //FAILED ATTEMPT 1: 
        //result.Foreground = "?android:attr/selectableItemBackground";

        //FAILED ATTEMPT 2 : 
        //result.SetBackgroundDrawable(view.Resources.GetDrawable(Resource.Drawable.ripple));

...

Теперь, как вы можете видеть, я попробовал это с помощью свойства переднего плана, основываясь на ответе на похожий вопрос, который можно найти здесь .

вторая попытка заставляет меня чувствовать, что она на правильном пути, но делает все мои карты невидимыми - иш: ссылка . (Я добавил ripple.xml в папку drawable моего проекта)

Я также нашел класс RippleDrawable, но я действительно не понимаю, как правильно его использовать. Он просит использовать маску и контент для рисования, но я понятия не имею, что там поставить. Моя реализация этого до сих пор:

result.Background = new RippleDrawable(view.Resources.GetColor(Resource.Color.green),????,?????);

Основная причина, по которой я хочу получить волновой эффект, заключается в том, что я показываю список карт, и у всех них есть событие onLongClick, которое открывает всплывающее меню. Я хочу указать, что карты кликабельны.

В любом случае, я надеюсь, что кто-нибудь поможет мне найти решение.

** ОБНОВЛЕНИЕ: ** карты становятся невидимыми с кодом пре-андроида 5.

 ...
 result.Tag = itemId.ToString();
 TypedValue outValue = new TypedValue();
        this.Activity.Theme.ResolveAttribute(Android.Resource.Attribute.SelectableItemBackground, outValue, true);
        result.SetBackgroundResource(outValue.ResourceId);

1 Ответ

0 голосов
/ 04 мая 2018

Ну, умный способ сделать это будет примерно так:

Примечание: Следующий код не работает на устройствах под управлением API-21 или Android Lollipop.

Добавьте следующий XML в папку макета.

Ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:color="@color/yourViewRippleColor"
tools:targetApi="lollipop">

<item>
<color android:color="@color/yourViewBackgroundColor" />
</item>

<item android:id="@android:id/mask">
  <shape android:shape="rectangle">
  <solid android:color="@color/yourViewRippleColor" />
  </shape>
</item>
</ripple>

И используйте его так, как нужно:

_yourView.SetBackgroundResource(Resource.Layout.Ripple);

И если я не ошибаюсь, вы можете сделать это чисто программно, используя что-то вроде этого:

Примечание: Должно работать на любом устройстве выше и в сотах.

TypedValue outValue = new TypedValue();
        this.Theme.ResolveAttribute(Android.Resource.Attribute.SelectableItemBackground, outValue, true);//In an Activity
        this.Activity.Theme.ResolveAttribute(Android.Resource.Attribute.SelectableItemBackground, outValue, true);//In an Fragment
        _YourView.SetBackgroundResource(outValue.ResourceId);

Гудлак!

Если у вас есть запросы, отмените.

...