2016-04-09 6 views
1

enter image description hereCropp Bild Imageview basiert auf der X-Achse

zu passen Wie Sie in Bild sehen können, haben wir zwei Arten von ImageView, eine Art Horizontal und andere Vertical. Wir möchten das Bild so laden, dass die Bitmap das ImageView füllt, Bilder können kleiner sein (wie Bild #1) oder größer und größer (wie Bild #2).

Unser Ziel ist es so etwas wie in Bild gezeigt, wollen wir Bilder auf ihre X-Axis und Ernte overfllow von ziehbar maßstäblich in Y-Axis

wir fast alle scale-type versucht, aber die Ergebnisse uns nicht zufrieden stellen, leider

+0

Sie möchten die Bildbreite skalieren, um Breite anzuzeigen und vertikales Bildende zu beschneiden, richtig? –

Antwort

1

wenn Sie Breite von drawable Spiel machen wollen mit ImageView ‚s Breite Sie Matrix verwenden können:

public Matrix scaleWidthMatrix(int imageWidth, int viewWidth) { 
    Matrix scaleMatrix = new Matrix(); 
    float scale = (float) viewWidth/imageWidth; 
    scaleMatrix.setScale(scale, scale); 
    return scaleMatrix; 
} 

Diese Methode gibt eine Skalierung Matrix zurück, um das Bild so zu skalieren, dass seine Breite ImageView entspricht und der Höhenfaktor nicht berücksichtigt wird. Teile der skalierten drawable, die außerhalb der ImageView Grenze liegen (in diesem Fall der untere Teil von drawable), werden abgeschnitten .

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final ImageView iv = (ImageView) findViewById(R.id.iv); 

    iv.getViewTreeObserver().addOnPreDrawListener(
     new ViewTreeObserver.OnPreDrawListener() { 
     @Override 
     public boolean onPreDraw() { 
      int imageWidth = iv.getDrawable().getIntrinsicWidth(); 
      Matrix matrix = scaleWidthMatrix(imageWidth, iv.getWidth()); 
      //we should setScaleType to Matrix in order to use image matrix 
      iv.setScaleType(ImageView.ScaleType.MATRIX); 
      iv.setImageMatrix(matrix); 
      //No need to call again so remove it 
      iv.getViewTreeObserver().removeOnPreDrawListener(this); 
      return true; 
     } 
    }); 

PS: OnPreDrawListener aufgerufen wird, kurz bevor onDraw Methode aufgerufen wird. An diesem Punkt wurden alle Ansichten in der Baumstruktur gemessen, sodass Sie gültige Argumente an die Methode scaleWidthMatrix übergeben können.