Chia tỷ lệ ImageView TOP_CROP


88

tôi có một ImageView cái đang hiển thị png có tỷ lệ khung hình lớn hơn tỷ lệ của thiết bị (nói theo chiều dọc - nghĩa là dài hơn). Tôi muốn hiển thị điều này trong khi vẫn duy trì tỷ lệ co, khớp với chiều rộng của chính và ghim chế độ xem hình ảnh lên đầu màn hình.

Vấn đề tôi gặp phải khi sử dụng CENTER_CROPlàm loại tỷ lệ là nó sẽ (có thể hiểu được) căn giữa hình ảnh được chia tỷ lệ thay vì căn chỉnh cạnh trên với cạnh trên của chế độ xem hình ảnh.

Vấn đề FIT_STARTlà hình ảnh sẽ vừa với chiều cao màn hình và không lấp đầy chiều rộng.

Tôi đã giải quyết vấn đề này bằng cách sử dụng ImageView tùy chỉnh và ghi đè onDraw(Canvas)và xử lý điều này theo cách thủ công bằng cách sử dụng canvas; vấn đề với cách tiếp cận này là 1) Tôi lo lắng có thể có một giải pháp đơn giản hơn, 2) Tôi nhận được ngoại lệ VM mem khi gọi super(AttributeSet)trong hàm tạo khi cố gắng đặt src img là 330kb khi heap có 3 mb trống (với kích thước đống là 6 mb) và không thể tìm ra lý do.

Mọi ý tưởng / đề xuất / giải pháp đều được hoan nghênh :)

Cảm ơn

ps tôi đã nghĩ rằng một giải pháp có thể là sử dụng loại tỷ lệ ma trận và tự mình thực hiện, nhưng điều đó có vẻ giống hoặc nhiều hơn giải pháp hiện tại của tôi!


1
Bạn đã thử với CENTER_CROP và đặt thuộc tính AdjustViewBounds là đúng với ImageView chưa?
PravinCG

2
Có, tôi đã thử điều đó, không thành công, tôi sợ vì nó sẽ mở rộng chế độ xem cho đến khi nó có chiều rộng cha mẹ của nó, sẽ không lớn hơn màn hình và sau đó căn giữa hình ảnh trên màn hình với chiều cao vượt quá / 2 nhô ra khỏi đầu và dưới cùng
Dori

Câu trả lời:


84

Ok, tôi có một giải pháp làm việc. Lời nhắc từ Darko khiến tôi nhìn lại lớp ImageView (cảm ơn) và đã áp dụng phép chuyển đổi bằng Ma trận (như tôi đã nghi ngờ ban đầu nhưng không thành công trong lần thử đầu tiên!). Trong lớp imageView tùy chỉnh của tôi, tôi gọi setScaleType(ScaleType.MATRIX)sau super()trong hàm tạo và có phương thức sau.

    @Override
    protected boolean setFrame(int l, int t, int r, int b)
    {
        Matrix matrix = getImageMatrix(); 
        float scaleFactor = getWidth()/(float)getDrawable().getIntrinsicWidth();    
        matrix.setScale(scaleFactor, scaleFactor, 0, 0);
        setImageMatrix(matrix);
        return super.setFrame(l, t, r, b);
    }

Tôi đã đặt int trong setFrame()phương thức như trong ImageView cuộc gọi đến configureBounds()nằm trong phương thức này, đó là nơi diễn ra tất cả các thứ về tỷ lệ và ma trận, vì vậy có vẻ hợp lý với tôi (nếu bạn không đồng ý)

Dưới đây là phương thức super.setFrame () từ AOSP

 @Override
    protected boolean setFrame(int l, int t, int r, int b) {
        boolean changed = super.setFrame(l, t, r, b);
        mHaveFrame = true;
        configureBounds();
        return changed;
    }

Tìm toàn bộ lớp src tại đây


Cảm ơn vì mã, @doridori! Nó hoạt động tốt! Tôi chỉ không hiểu tại sao anh lại lặp lại phương pháp "setFrame" trong lời giải thích của bạn ... Tôi đã từng chỉ là một đầu tiên với thành công (và hoàn toàn phớt lờ xD giây)
Alesqui

3
Sau khi chiến đấu với điều này thông qua bố cục xml trong hai giờ, điều này đã hoạt động. Tôi ước tôi có thể cung cấp cho bạn nhiều thuyền hơn.
Mark Beaton

5
Tôi đã phải gọi siêu () trước khi cơ thể nếu không thì hình ảnh sẽ không hiển thị mà không có một repaint
sherpya

1
@VitorHugoSchwaab bạn phải THMs sử dụng như matrix.postTranslate (..)
Anton Kizema

1
không thể sử dụng nền? chỉ sử dụng src?
Egos Zhang,

43

đây là mã của tôi để căn giữa nó ở dưới cùng. Btw. trong Dori's Code là một lỗi nhỏ: Vì super.frame()nó được gọi ở cuối, getWidth()phương thức có thể trả về giá trị sai. Nếu bạn muốn căn giữa nó ở trên cùng, chỉ cần xóa dòng postTranslate là xong. Điều tuyệt vời là với mã này, bạn có thể di chuyển nó đến bất cứ đâu bạn muốn. (đúng, trung tâm => không vấn đề gì;)

    public class CenterBottomImageView extends ImageView {

        public CenterBottomImageView(Context context) {
            super(context);
            setup();
        }

        public CenterBottomImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
            setup();
        }

        public CenterBottomImageView(Context context, AttributeSet attrs,
                int defStyle) {
            super(context, attrs, defStyle);
            setup();
        }

        private void setup() {
            setScaleType(ScaleType.MATRIX);
        }

        @Override
        protected boolean setFrame(int frameLeft, int frameTop, int frameRight, int frameBottom) {
            if (getDrawable() == null) {
                return super.setFrame(frameLeft, frameTop, frameRight, frameBottom);
            }
            float frameWidth = frameRight - frameLeft;
            float frameHeight = frameBottom - frameTop;

            float originalImageWidth = (float)getDrawable().getIntrinsicWidth();
            float originalImageHeight = (float)getDrawable().getIntrinsicHeight();

            float usedScaleFactor = 1;

            if((frameWidth > originalImageWidth) || (frameHeight > originalImageHeight)) {
                // If frame is bigger than image
                // => Crop it, keep aspect ratio and position it at the bottom and center horizontally

                float fitHorizontallyScaleFactor = frameWidth/originalImageWidth;
                float fitVerticallyScaleFactor = frameHeight/originalImageHeight;

                usedScaleFactor = Math.max(fitHorizontallyScaleFactor, fitVerticallyScaleFactor);
            }

            float newImageWidth = originalImageWidth * usedScaleFactor;
            float newImageHeight = originalImageHeight * usedScaleFactor;

            Matrix matrix = getImageMatrix();
            matrix.setScale(usedScaleFactor, usedScaleFactor, 0, 0); // Replaces the old matrix completly
//comment matrix.postTranslate if you want crop from TOP
            matrix.postTranslate((frameWidth - newImageWidth) /2, frameHeight - newImageHeight);
            setImageMatrix(matrix);
            return super.setFrame(frameLeft, frameTop, frameRight, frameBottom);
        }

    }

Tuyệt vời, cảm ơn vì đã chỉ ra lỗi. Tôi đã không chạm vào mã này trong một thời gian vì vậy đây có thể là một đề xuất ngu ngốc nhưng để sửa lỗi setWidth mà bạn chỉ ra có thể không chỉ sử dụng (r-l)thay thế?
Dori

Chắc chắn dòng if((frameWidth > originalImageWidth) || (frameHeight > originalImageHeight))phải được đảo ngược? Nói cách khác, bạn không nên kiểm tra xem hình ảnh có lớn hơn khung hình hay không? Tôi đề nghị thay thế nó bằngif((originalImageWidth > frameWidth ) || (originalImageHeight > frameHeight ))
Carlos P

Tôi đã chọn chiều rộng từ cha mẹ sử dụng ((View) getParent()).getWidth()kể từ khi ImageViewMATCH_PARENT
sherpya

@Jay nó hoạt động tuyệt vời. Tôi đang thực hiện các phép tính ma trận trong phương thức onLayout (), phương thức này cũng được gọi khi quay, trong khi setFrame thì không.
hộp

Cảm ơn cho điều này, hoạt động hoàn hảo, và cũng cảm ơn vì đưa ra một cách để nhanh chóng thay đổi cây trồng dưới để cắt đầu bằng cách bình luận 1 dòng mã
Moonbloom

39

Bạn không cần phải viết Chế độ xem hình ảnh tùy chỉnh để có được TOP_CROPchức năng. Bạn chỉ cần phải sửa đổi matrixcủa ImageView.

  1. Đặt scaleTypethành matrixcho ImageView:

    <ImageView
          android:id="@+id/imageView"
          android:contentDescription="Image"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:src="@drawable/image"
          android:scaleType="matrix"/>
  2. Đặt ma trận tùy chỉnh cho ImageView:

    final ImageView imageView = (ImageView) findViewById(R.id.imageView);
    final Matrix matrix = imageView.getImageMatrix();
    final float imageWidth = imageView.getDrawable().getIntrinsicWidth();
    final int screenWidth = getResources().getDisplayMetrics().widthPixels;
    final float scaleRatio = screenWidth / imageWidth;
    matrix.postScale(scaleRatio, scaleRatio);
    imageView.setImageMatrix(matrix);

Làm điều này sẽ cung cấp cho bạn TOP_CROPchức năng.


2
Điều này đã làm việc cho tôi. Tuy nhiên, tôi phải kiểm tra scaleRation nếu nó <1 thì tôi chỉ cần thay đổi scaleTypethành centerCropnếu không, tôi sẽ thấy khoảng trống trên các cạnh.
Arst

Làm thế nào để làm cho điều này hoạt động cho các trường hợp cần hình ảnh căn chỉnh dưới cùng?
Sagar

26

Ví dụ này hoạt động với hình ảnh được tải sau khi tạo đối tượng + một số tối ưu hóa. Tôi đã thêm một số nhận xét trong mã giải thích những gì đang xảy ra.

Nhớ gọi:

imageView.setScaleType(ImageView.ScaleType.MATRIX);

hoặc là

android:scaleType="matrix"

Nguồn Java:

import com.appunite.imageview.OverlayImageView;

public class TopAlignedImageView extends ImageView {
    private Matrix mMatrix;
    private boolean mHasFrame;

    @SuppressWarnings("UnusedDeclaration")
    public TopAlignedImageView(Context context) {
        this(context, null, 0);
    }

    @SuppressWarnings("UnusedDeclaration")
    public TopAlignedImageView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    @SuppressWarnings("UnusedDeclaration")
    public TopAlignedImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mHasFrame = false;
        mMatrix = new Matrix();
        // we have to use own matrix because:
        // ImageView.setImageMatrix(Matrix matrix) will not call
        // configureBounds(); invalidate(); because we will operate on ImageView object
    }

    @Override
    protected boolean setFrame(int l, int t, int r, int b)
    {
        boolean changed = super.setFrame(l, t, r, b);
        if (changed) {
            mHasFrame = true;
            // we do not want to call this method if nothing changed
            setupScaleMatrix(r-l, b-t);
        }
        return changed;
    }

    private void setupScaleMatrix(int width, int height) {
        if (!mHasFrame) {
            // we have to ensure that we already have frame
            // called and have width and height
            return;
        }
        final Drawable drawable = getDrawable();
        if (drawable == null) {
            // we have to check if drawable is null because
            // when not initialized at startup drawable we can
            // rise NullPointerException
            return;
        }
        Matrix matrix = mMatrix;
        final int intrinsicWidth = drawable.getIntrinsicWidth();
        final int intrinsicHeight = drawable.getIntrinsicHeight();

        float factorWidth = width/(float) intrinsicWidth;
        float factorHeight = height/(float) intrinsicHeight;
        float factor = Math.max(factorHeight, factorWidth);

        // there magic happen and can be adjusted to current
        // needs
        matrix.setTranslate(-intrinsicWidth/2.0f, 0);
        matrix.postScale(factor, factor, 0, 0);
        matrix.postTranslate(width/2.0f, 0);
        setImageMatrix(matrix);
    }

    @Override
    public void setImageDrawable(Drawable drawable) {
        super.setImageDrawable(drawable);
        // We have to recalculate image after chaning image
        setupScaleMatrix(getWidth(), getHeight());
    }

    @Override
    public void setImageResource(int resId) {
        super.setImageResource(resId);
        // We have to recalculate image after chaning image
        setupScaleMatrix(getWidth(), getHeight());
    }

    @Override
    public void setImageURI(Uri uri) {
        super.setImageURI(uri);
        // We have to recalculate image after chaning image
        setupScaleMatrix(getWidth(), getHeight());
    }

    // We do not have to overide setImageBitmap because it calls 
    // setImageDrawable method

}

Làm thế nào để làm cho điều này hoạt động cho các trường hợp cần hình ảnh căn chỉnh dưới cùng?
Sagar

13

Dựa trên Dori, tôi đang sử dụng một giải pháp chia tỷ lệ hình ảnh dựa trên chiều rộng hoặc chiều cao của hình ảnh để luôn lấp đầy vùng chứa xung quanh. Điều này cho phép chia tỷ lệ hình ảnh để lấp đầy toàn bộ không gian có sẵn bằng cách sử dụng điểm trên cùng bên trái của hình ảnh thay vì trung tâm như điểm gốc (CENTER_CROP):

@Override
protected boolean setFrame(int l, int t, int r, int b)
{

    Matrix matrix = getImageMatrix(); 
    float scaleFactor, scaleFactorWidth, scaleFactorHeight;
    scaleFactorWidth = (float)width/(float)getDrawable().getIntrinsicWidth();
    scaleFactorHeight = (float)height/(float)getDrawable().getIntrinsicHeight();    

    if(scaleFactorHeight > scaleFactorWidth) {
        scaleFactor = scaleFactorHeight;
    } else {
        scaleFactor = scaleFactorWidth;
    }

    matrix.setScale(scaleFactor, scaleFactor, 0, 0);
    setImageMatrix(matrix);

    return super.setFrame(l, t, r, b);
}

Tôi hy vọng điều này sẽ giúp ích - hoạt động giống như một điều trị trong dự án của tôi.


11
Đây là giải pháp tốt hơn ... Và thêm: float width = r - l; chiều cao phao = b - t;
Geltrude

9

Không có giải pháp nào trong số những giải pháp này phù hợp với tôi, bởi vì tôi muốn một lớp hỗ trợ cắt xén tùy ý theo hướng ngang hoặc dọc và tôi muốn nó cho phép tôi thay đổi vùng cắt một cách động. Tôi cũng cần Picasso tương thích, và Picasso đặt drawables hình ảnh uể oải.

Việc triển khai của tôi được điều chỉnh trực tiếp từ ImageView.java trong AOSP. Để sử dụng nó, hãy khai báo như vậy trong XML:

    <com.yourapp.PercentageCropImageView
        android:id="@+id/view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="matrix"/>

Từ nguồn, nếu bạn muốn có cây trồng hàng đầu, hãy gọi:

imageView.setCropYCenterOffsetPct(0f);

Nếu bạn muốn có phần dưới cùng, hãy gọi:

imageView.setCropYCenterOffsetPct(1.0f);

Nếu bạn muốn cắt bớt 1/3 đoạn đường, hãy gọi:

imageView.setCropYCenterOffsetPct(0.33f);

Hơn nữa, nếu bạn chọn sử dụng một phương pháp cắt khác, như fit_center, bạn có thể làm như vậy và không có logic tùy chỉnh nào được kích hoạt. (Các triển khai khác CHỈ cho phép bạn sử dụng các phương pháp cắt xén của họ).

Cuối cùng, tôi đã thêm một phương thức, redraw (), vì vậy nếu bạn chọn thay đổi động phương thức cắt / scaleType của mình trong mã, bạn có thể buộc chế độ xem vẽ lại. Ví dụ:

fullsizeImageView.setScaleType(ScaleType.FIT_CENTER);
fullsizeImageView.redraw();

Để quay lại phần cắt trên cùng-giữa-thứ ba tùy chỉnh của bạn, hãy gọi:

fullsizeImageView.setScaleType(ScaleType.MATRIX);
fullsizeImageView.redraw();

Đây là lớp học:

/* 
 * Adapted from ImageView code at: 
 * http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.4_r1/android/widget/ImageView.java
 */
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;

public class PercentageCropImageView extends ImageView{

    private Float mCropYCenterOffsetPct;
    private Float mCropXCenterOffsetPct;

    public PercentageCropImageView(Context context) {
        super(context);
    }

    public PercentageCropImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public PercentageCropImageView(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
    }

    public float getCropYCenterOffsetPct() {
        return mCropYCenterOffsetPct;
    }

    public void setCropYCenterOffsetPct(float cropYCenterOffsetPct) {
        if (cropYCenterOffsetPct > 1.0) {
            throw new IllegalArgumentException("Value too large: Must be <= 1.0");
        }
        this.mCropYCenterOffsetPct = cropYCenterOffsetPct;
    }

    public float getCropXCenterOffsetPct() {
        return mCropXCenterOffsetPct;
    }

    public void setCropXCenterOffsetPct(float cropXCenterOffsetPct) {
        if (cropXCenterOffsetPct > 1.0) {
            throw new IllegalArgumentException("Value too large: Must be <= 1.0");
        }
        this.mCropXCenterOffsetPct = cropXCenterOffsetPct;
    }

    private void myConfigureBounds() {
        if (this.getScaleType() == ScaleType.MATRIX) {
            /*
             * Taken from Android's ImageView.java implementation:
             * 
             * Excerpt from their source:
    } else if (ScaleType.CENTER_CROP == mScaleType) {
       mDrawMatrix = mMatrix;

       float scale;
       float dx = 0, dy = 0;

       if (dwidth * vheight > vwidth * dheight) {
           scale = (float) vheight / (float) dheight; 
           dx = (vwidth - dwidth * scale) * 0.5f;
       } else {
           scale = (float) vwidth / (float) dwidth;
           dy = (vheight - dheight * scale) * 0.5f;
       }

       mDrawMatrix.setScale(scale, scale);
       mDrawMatrix.postTranslate((int) (dx + 0.5f), (int) (dy + 0.5f));
    }
             */

            Drawable d = this.getDrawable();
            if (d != null) {
                int dwidth = d.getIntrinsicWidth();
                int dheight = d.getIntrinsicHeight();

                Matrix m = new Matrix();

                int vwidth = getWidth() - this.getPaddingLeft() - this.getPaddingRight();
                int vheight = getHeight() - this.getPaddingTop() - this.getPaddingBottom();

                float scale;
                float dx = 0, dy = 0;

                if (dwidth * vheight > vwidth * dheight) {
                    float cropXCenterOffsetPct = mCropXCenterOffsetPct != null ? 
                            mCropXCenterOffsetPct.floatValue() : 0.5f;
                    scale = (float) vheight / (float) dheight;
                    dx = (vwidth - dwidth * scale) * cropXCenterOffsetPct;
                } else {
                    float cropYCenterOffsetPct = mCropYCenterOffsetPct != null ? 
                            mCropYCenterOffsetPct.floatValue() : 0f;

                    scale = (float) vwidth / (float) dwidth;
                    dy = (vheight - dheight * scale) * cropYCenterOffsetPct;
                }

                m.setScale(scale, scale);
                m.postTranslate((int) (dx + 0.5f), (int) (dy + 0.5f));

                this.setImageMatrix(m);
            }
        }
    }

    // These 3 methods call configureBounds in ImageView.java class, which
    // adjusts the matrix in a call to center_crop (android's built-in 
    // scaling and centering crop method). We also want to trigger
    // in the same place, but using our own matrix, which is then set
    // directly at line 588 of ImageView.java and then copied over
    // as the draw matrix at line 942 of ImageVeiw.java
    @Override
    protected boolean setFrame(int l, int t, int r, int b) {
        boolean changed = super.setFrame(l, t, r, b);
        this.myConfigureBounds();
        return changed;
    }
    @Override
    public void setImageDrawable(Drawable d) {          
        super.setImageDrawable(d);
        this.myConfigureBounds();
    }
    @Override
    public void setImageResource(int resId) {           
        super.setImageResource(resId);
        this.myConfigureBounds();
    }

    public void redraw() {
        Drawable d = this.getDrawable();

        if (d != null) {
            // Force toggle to recalculate our bounds
            this.setImageDrawable(null);
            this.setImageDrawable(d);
        }
    }
}

5

Có thể đi vào mã nguồn cho chế độ xem hình ảnh trên android và xem cách nó vẽ vùng cắt trung tâm, v.v. và có thể sao chép một số mã đó vào các phương thức của bạn. Tôi thực sự không biết giải pháp tốt hơn là làm điều này. tôi có kinh nghiệm thay đổi kích thước và cắt bitmap theo cách thủ công (tìm kiếm các phép biến đổi bitmap) làm giảm kích thước thực của nó nhưng nó vẫn tạo ra một chút chi phí trong quá trình này.


3
public class ImageViewTopCrop extends ImageView {
public ImageViewTopCrop(Context context) {
    super(context);
    setScaleType(ScaleType.MATRIX);
}

public ImageViewTopCrop(Context context, AttributeSet attrs) {
    super(context, attrs);
    setScaleType(ScaleType.MATRIX);
}

public ImageViewTopCrop(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    setScaleType(ScaleType.MATRIX);
}

@Override
protected boolean setFrame(int l, int t, int r, int b) {
    computMatrix();
    return super.setFrame(l, t, r, b);
}

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);
    computMatrix();
}

private void computMatrix() {
    Matrix matrix = getImageMatrix();
    float scaleFactor = getWidth() / (float) getDrawable().getIntrinsicWidth();
    matrix.setScale(scaleFactor, scaleFactor, 0, 0);
    setImageMatrix(matrix);
}

}


setFrame && onLayout
tianxia

computMatrix: bạn có thể thực hiện bất kỳ ma trận nào tại đây.
tianxia

onLayouttiết kiệm cho tôi rất nhiều! Cảm ơn! Tôi đã gặp sự cố trong đó nó tính toán ma trận nhưng không hiển thị hình ảnh ngay lập tức và việc thêm onLayoutvào mã giải quyết vấn đề của tôi.
natsumiyu

1

Nếu bạn đang sử dụng Fresco (SimpleDraweeView), bạn có thể dễ dàng làm điều đó với:

 PointF focusPoint = new PointF(0.5f, 0f);
 imageDraweeView.getHierarchy().setActualImageFocusPoint(focusPoint);

Cái này sẽ dành cho cây trồng trên cùng.

Thông tin thêm tại Liên kết tham khảo


0

Có 2 vấn đề với các giải pháp ở đây:

  • Chúng không hiển thị trong trình chỉnh sửa bố cục của Android Studio (vì vậy bạn có thể xem trước trên các kích thước màn hình và tỷ lệ khung hình khác nhau)
  • Nó chỉ chia tỷ lệ theo chiều rộng, vì vậy tùy thuộc vào tỷ lệ khung hình của thiết bị và hình ảnh, bạn có thể kết thúc bằng một dải trống ở phía dưới

Sửa đổi nhỏ này khắc phục sự cố (đặt mã trong onDraw và kiểm tra các yếu tố tỷ lệ chiều rộng và chiều cao):

@Override
protected void onDraw(Canvas canvas) {

    Matrix matrix = getImageMatrix();

    float scaleFactorWidth = getWidth() / (float) getDrawable().getIntrinsicWidth();
    float scaleFactorHeight = getHeight() / (float) getDrawable().getIntrinsicHeight();

    float scaleFactor = (scaleFactorWidth > scaleFactorHeight) ? scaleFactorWidth : scaleFactorHeight;

    matrix.setScale(scaleFactor, scaleFactor, 0, 0);
    setImageMatrix(matrix);

    super.onDraw(canvas);
}

-1

Giải pháp đơn giản nhất: Kẹp hình ảnh

 @Override
    public void draw(Canvas canvas) {
        if(getWidth() > 0){
            int clipHeight = 250;
            canvas.clipRect(0,clipHeight,getWidth(),getHeight());
         }
        super.draw(canvas);
    }

Điều này sẽ không tăng tỷ lệ hình ảnh nếu nó nhỏ hơn chế độ xem, đó là lý do tại sao các giải pháp khác không đơn giản như vậy.
OldSchool4664
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.