Как раскрасить рисунок, не затрагивая прозрачные области изображения? - PullRequest
0 голосов
/ 08 апреля 2019

В большинстве графических программ, таких как Photoshop и Gimp, есть функция colorize, так что вы можете легко закрасить изображение в оттенках серого цветом по вашему выбору. Я хочу сделать то же самое с изображением в моем приложении для Android. Я искал в функции setColorFilter. Это то, что я пытался.

ImageView border = (ImageView) findViewById(R.id.imageView);
int color = Color.parseColor("#F57F17"); // the color to use
border.setColorFilter(color, PorterDuff.Mode.OVERLAY);

Это именно то, что мне нужно. Единственная проблема заключается в том, что он также окрашивает прозрачные области на изображении. Я хочу, чтобы прозрачные области оставались прозрачными.

Есть ли способ добиться этого?

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Раскрасьте раскрашиваемый объект и установите его обратно.Я делаю это с помощью привязки и адаптера для переопределения цветов изображений для рисования.

Например, я изменяю цвет рисования на основе выбранного статуса ниже:

  @JvmStatic
@BindingAdapter("backgroundDrawableChange")
fun backgroundDrawableChange(view: RelativeLayout, isSelected: Boolean){
    var bgDrawable: LayerDrawable = view.background as LayerDrawable
    var shape: GradientDrawable =  bgDrawable.findDrawableByLayerId(R.id.shapeId) as GradientDrawable
    shape.setColor(Color.parseColor((if (isSelected) YACustomPreference.getInstance(view.context).getPrimaryColorHex() else YACustomPreference.getInstance(view.context).getWhite())))
}

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

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    inflater.inflate(R.menu.menu_info_fragment, menu)
    try{
        //get drawable filter, change color, and reassign
        var filterDrawable = menu.findItem(R.id.action_filter).icon
        filterDrawable = DrawableCompat.wrap(filterDrawable)
        DrawableCompat.setTint(filterDrawable, Color.parseColor(YACustomPreference.getInstance(activity!!).getPrimaryTextColorHex()))
        menu.findItem(R.id.action_filter).icon = filterDrawable

        //get searchview drawable change color and setup listener
        mSearchView = menu.findItem(R.id.action_search)?.actionView as SearchView
        mSearchView?.setOnQueryTextListener(this)
        val searchDrawableImageView = mSearchView?.findViewById<View>(androidx.appcompat.R.id.search_button) as ImageView
        val searchDrawable = ResourcesCompat.getDrawable(resources, R.drawable.ic_search_action, null)
        DrawableCompat.setTint(searchDrawable!!, Color.parseColor(YACustomPreference.getInstance(activity!!).getPrimaryTextColorHex()))
        searchDrawableImageView.setImageDrawable(searchDrawable)
    }catch (ex: Exception){
        A35Log.e(TAG, "Error updating SearchView drawable icon")
    }

    super.onCreateOptionsMenu(menu, inflater)
}

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

0 голосов
/ 08 апреля 2019

Вы ищете SRC_ATOP:

ImageView border = (ImageView) findViewById(R.id.imageView);
int color = Color.parseColor("#F57F17"); // the color to use
border.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
...