Como diminuir a resolução de imagens corretamente?

fundo

Criando um aplicativo que tem muitas imagens de alta qualidade, decidi diminuir as imagens para o tamanho necessário (o que significa que se a imagem for maior que a tela, eu a reduzo).

O problema

Percebi que em alguns dispositivos, se as imagens são reduzidas, elas se tornam borradas / pixeladas, mas nos mesmos dispositivos, para o mesmo tamanho de imageView de destino, se as imagens não tiverem downscaled, elas ficarão bem.

O que eu tentei

Decidi verificar essa questão ainda mais e criei um pequeno aplicativo POC que mostra o problema.

Antes de mostrar seu código, aqui está uma demonstração do que estou falando:

É um pouco difícil ver a diferença, mas você pode ver que o segundo é um pouco pixelado. isso pode ser mostrado em qualquer imagem.

public class MainActivity extends Activity
  {
  @Override
  protected void onCreate(final Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final ImageView originalImageView=(ImageView)findViewById(R.id.originalImageView);
    final ImageView halvedImageView=(ImageView)findViewById(R.id.halvedImageView);
    final ImageView halvedBitmapImageView=(ImageView)findViewById(R.id.halvedBitmapImageView);
    //
    final Bitmap originalBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.test);
    originalImageView.setImageBitmap(originalBitmap);
    halvedImageView.setImageBitmap(originalBitmap);
    //
    final LayoutParams layoutParams=halvedImageView.getLayoutParams();
    layoutParams.width=originalBitmap.getWidth()/2;
    layoutParams.height=originalBitmap.getHeight()/2;
    halvedImageView.setLayoutParams(layoutParams);
    //
    final Options options=new Options();
    options.inSampleSize=2;
    // options.inDither=true; //didn't help
    // options.inPreferQualityOverSpeed=true; //didn't help
    final Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.test,options);
    halvedBitmapImageView.setImageBitmap(bitmap);
    }
  }

xml:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
  android:layout_height="match_parent" tools:context=".MainActivity"
  android:fillViewport="true">
  <HorizontalScrollView android:layout_width="match_parent"
    android:fillViewport="true" android:layout_height="match_parent">
    <LinearLayout android:layout_width="match_parent"
      android:layout_height="match_parent" android:orientation="vertical">


      <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:text="original" />

      <ImageView android:layout_width="wrap_content"
        android:id="@+id/originalImageView" android:layout_height="wrap_content" />

      <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:text="original , imageView size is halved" />

      <ImageView android:layout_width="wrap_content"
        android:id="@+id/halvedImageView" android:layout_height="wrap_content" />

      <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:text="bitmap size is halved" />

      <ImageView android:layout_width="wrap_content"
        android:id="@+id/halvedBitmapImageView" android:layout_height="wrap_content" />

    </LinearLayout>
  </HorizontalScrollView>
</ScrollView>
A questão

Por que isso ocorre?

Ambos os métodos devem ter o mesmo resultado, pois ambos são da mesma fonte e usam o mesmo fator.

Eu tentei jogar com o método downsampling, mas nada ajudou.

Usando o inDensity (em vez de inSampleSize) parece consertá-lo, mas não tenho certeza do que definir para isso. Eu acho que para imagens externas (da internet, por exemplo), eu posso configurá-lo para a densidade da tela multiplicada pelo tamanho da amostra que eu gostaria de usar.

Mas é mesmo uma boa solução? o que devo fazer no caso de as imagens estarem dentro da pasta de recursos (não acho que exista uma função para obter qual pasta de densidade um bitmap está localizado)? por que funciona enquanto usa a maneira recomendada?Aqui) não funciona bem?

EDIT: eu descobri um truque para obter qual densidade é usada para um drawable você obter dos recursos (link aqui). no entanto, não é uma prova futura, pois você precisa ser específico para a densidade a ser detectada.

questionAnswers(3)

yourAnswerToTheQuestion