2016-08-26 3 views
-3

Я внедрил ColorStateList на моей пользовательской форме. Кнопка, которая, конечно же, изменит сплошной цвет, когда кнопка нажата и не нажата.Как установить GradiantDrawable.setdColor() ниже API 21?

Он отлично работает на API> = 21, но не на телефонах, которые ниже API 21, поскольку настройка цвета GradiantDrawable установлена ​​для API 21+.

Итак, как я могу архивировать один и тот же эффект для api ниже 21?

Это, как в настоящее время выглядит мой метод:

public void SelectorEffect(View v) { 

    ColorStateList colorStateList = null; 
    GradientDrawable gd = null; 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 

     if (v.getId() == R.id.login_btn) { 

      colorStateList = getPressedColorSelector(ContextCompat.getColor(this, R.color.arion_light), ContextCompat.getColor(this, R.color.arion_light2)); 
      gd = (GradientDrawable) getApplicationContext().getResources().getDrawable(R.drawable.arion_buttonshape_login); 

     } else if (v.getId() == R.id.createAccount_btn) { 
      colorStateList = getPressedColorSelector(ContextCompat.getColor(this, R.color.arion_blue), ContextCompat.getColor(this, R.color.arion_light2)); 
      gd = (GradientDrawable) getApplicationContext().getResources().getDrawable(R.drawable.arion_buttonshape_create); 

     } 


     gd.setColor(colorStateList); 


    } else { 

     //Code for phones below API 21: 

    } 

} 

ответ

0

решаемые с помощью ColorFilter и onTouchListener Для телефонов ниже API 21 Я использую onTouchListener на мой взгляд слушать ACTION_DOWN; Затем я применяю ColorFilter на этой точке зрения с заданным цветом с PorterDuff.Mode.SRC_ATOP если ACTION_UP: я просто установить мой colorfilter обнулить и кнопка снова получает свой прежний цвет

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 


     if (view.getId() == R.id.login_btn) { 

      colorStateList = getPressedColorSelector(); 
      gd = (GradientDrawable) super.getView().getBackground(); 
      gd.setColor(colorStateList); 

     } else if (view.getId() == R.id.createAccount_btn) { 

      colorStateList = getPressedColorSelector(); 
      gd = (GradientDrawable) super.getView().getBackground(); 
      gd.setColor(colorStateList); 


     } 


    } else { 

     /* 
     BELOW API 21 SOLUTION: 
     */ 

     button.getView().setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View view, MotionEvent motionEvent) { 

       if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 

        button.getView().getBackground().setColorFilter(selectedColor, PorterDuff.Mode.SRC_ATOP); 
        return true; 

       } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { 


        button.getView().getBackground().setColorFilter(null); 
        return true; 
       } 


       return false; 
      } 
     }); 

    } 

} 


//The colorStateList only for API >=21 
private ColorStateList getPressedColorSelector() { 

    return new ColorStateList(
      new int[][] 
        { 
          new int[]{android.R.attr.state_pressed}, 
          new int[]{-android.R.attr.state_activated}, 
          new int[]{} 
        }, 
      new int[] 
        { 
          selectedColor, 
          defaultColor, 
          defaultColor, 
        } 
    ); 
}