2016-05-16 2 views
3

у меня есть этот код из RatingBar android - custom draw runtimeAndroid SetTint больше не работает

Он работал до которого я использовал, чтобы изменить цвет графики на мой рейтинг управления:

   vthf.rating.setOnTouchListener(new OnTouchListener() { 
       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        if (event.getAction() == MotionEvent.ACTION_UP) { 
        //-- 
        float touchPositionX = event.getX(); 
        float width = vthf.rating.getWidth(); 
        float starsf = (touchPositionX/width); 
        starsf = starsf * param_final__data.score_max; 
        int starsint = (int) Math.round(starsf); 
        byte starsbyte = (byte) starsint; 
        param_final__data.score_cur = starsbyte; 
        starsf = starsint; 
        vthf.rating.setRating(starsf); 
        //-- 
        int color = Color.BLACK; 
        switch (starsbyte % 4) { 
         case 0: color = Color.BLUE; break; // 4 stars 
         case 3: color = Color.GREEN; break; 
         case 2: color = Color.YELLOW; break; 
         case 1: color = Color.RED; break; 
        } 
        final LayerDrawable layerDrawable = (LayerDrawable) vthf.rating.getProgressDrawable(); 
        Drawable myWrap = layerDrawable.getDrawable(2); 
        //-- 
        // 
        //-- 
        myWrap = DrawableCompat.wrap(myWrap); 
        //myWrap = myWrap.mutate(); 
        //-- 
        // myWrapMutate.setColorFilter(color, PorterDuff.Mode.SRC_IN); 
        // DrawableCompat.setTintList(myWrap, ColorStateList.valueOf(color)); 
        //-- 
        DrawableCompat.setTint(myWrap, color); 
        //-- 
        vthf.rating.invalidate(); 
        } 
        else 
        if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        param_final__view.setPressed(true); 
        } 
        else 
        if (event.getAction() == MotionEvent.ACTION_CANCEL) { 
        param_final__view.setPressed(false); 
        } 
        return true; 
       } 
       }); 

Я считаю, что он перестал работать после того, как я обновлен от Android Studio 1.5.1 и всех библиотек поддержки (не уверен, какая версия). Я не уверен на 100%, хотя, поскольку я не уверен, что я немедленно устранил проблему или был здесь дольше.

Я tesing на Huawei P6 Android 4.4.2

Мой Gradle выглядит как его:

compileSdkVersion 23 
buildToolsVersion '23' 

dependencies { 
    compile 'com.android.support:support-v4:+' 
    compile 'com.google.android.gms:play-services:+' 
    compile 'com.android.support:appcompat-v7:+' 
} 

Мой манифеста этот

<uses-sdk 
    android:minSdkVersion="9" 
    android:targetSdkVersion="17" 
/> 

Это мой лучший свинец почему код больше не работает, но я открыт для всех видов предложений, если мне не хватает чего-то очевидного, что может привести к тому, что это не связано с версиями API.

--- Примечание ---

Этот код появляется подкрасить рисунок немного темнее:

     final LayerDrawable layerDrawable = (LayerDrawable) vthf.rating.getProgressDrawable(); 
        Drawable myWrap = layerDrawable.getDrawable(2); 
        myWrap = DrawableCompat.wrap(myWrap); 
        DrawableCompat.setTint(myWrap, color); 

Этот код не имеет никакого эффекта:

     final LayerDrawable layerDrawable = (LayerDrawable) vthf.rating.getProgressDrawable(); 
        Drawable myWrap = layerDrawable.getDrawable(2); 
        DrawableCompat.setTint(myWrap, color); 

Не уверен, что сделать из вышесказанного. Может быть, проблема вызвана чем-то другим, чего я не понимаю. Если графика потемнеет, можно подумать, что она работает нормально ... Но это то же самое темное, какой бы он ни был цвет - по крайней мере, насколько мой глаз может сказать.

+0

[http://stackoverflow.com/a/30876871/4049612](http://stackoverflow.com/a/30876871/4049612) проверить это – Krishna

+0

Я считаю, что я уже пробовал все это (wrap, settintlist, settint, invalidateself), или я что-то упускаю? – Tom

+0

@Krishna Вы предлагаете сделать что-то вроде этого «layerDrawable.setDrawable (2, myWrap)»; ?Он сбой (и не был необходим ранее) – Tom

ответ

2

Что-то в AppCompat 23.3 нарушает мое предыдущее решение. Во всяком случае, вы можете получить свой рейтинг бар на работу, просто избегая DrawableCompat#Wrap:

ratingBarB.setOnTouchListener(new View.OnTouchListener() { 
    private int lastColoredProgress = 0; 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     int progress = ratingBarB.getProgress(); 
     if (progress != lastColoredProgress) { 
      lastColoredProgress = progress; 
      int color; 
      switch (lastColoredProgress) { 
       case 0: 
       case 1: 
        color = Color.RED; 
        break; 
       case 2: 
       case 3: 
        color = Color.YELLOW; 
        break; 
       case 4: 
       default: 
        color = Color.GREEN; 
        break; 
      } 
      final Drawable drawable = ratingBarB.getProgressDrawable(); 
      if (drawable instanceof LayerDrawable) { // Lollipop and newer 
       final LayerDrawable layerDrawable = (LayerDrawable) drawable; 
       DrawableCompat.setTint(layerDrawable.getDrawable(2), color); 
      } else { 
       DrawableCompat.setTint(drawable, color); 
      } 
     } 
     return false; 
    } 
}); 

3

Когда вы завертываете Drawable с помощью DrawableCompat, создается новый DrawableWrapper. Вам необходимо установить новый вариант для вашего компонента.

В вашем коде, вам нужно добавить somethink как это (только после setTint):

layerDrawable.setCompoundDrawablesWithIntrinsicBounds(myWrap, null, null, null); 
+0

Я не уверен, как исправить второй индекс, извлекаемый внутри vthf.rating.getProgressDrawable(); поскольку он падает, когда я пытаюсь использовать layerDrawable.setDrawable (2, myWrap); – Tom

+0

Кроме того, Android Studio не может разрешить layerDrawable.setCompoundDrawablesWithIntrinsicBounds ... – Tom

3

я использую что-то вроде этого, чтобы установить цвет. Возможно, здесь тоже будет работать, все объекты, которые унаследовали от View, должны быть в состоянии сделать это. Этот случай использует ContextCompat для перехода к цвету, но есть больше способов, чем получить желаемый цвет.

View view = (findViewById(R.id.text_view_location)); 
view.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.wantedColor));