1

画像ビューを使用して顧客の写真を表示し、このコマンドを使用して画像ビューで画像をスケーリングします

 iv.setScaleType(ImageView.ScaleType.CENTER_CROP);

しかし、このコマンドの後、顧客の頭が部分的にカットされたので、画像の下部がカットされるように、中央のトリミングコマンドの後に画像をボタンにスケーリングしたい

4

1 に答える 1

1

お客様の要件にすぐに対応できるソリューションはありません。スケーリングは自分で行う必要があります。方法は次のとおりです。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // we need to wait till the layout has been inflated to get the size of the ImageView
        final ImageView iv = (ImageView) findViewById(R.id.image);
        iv.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
                public void onGlobalLayout() {
                    scaleBitmap(iv);
                }
            }
        );
    }

    private void scaleBitmap(ImageView iv) {
        // get ImageView and determine width & height
        int imageWidth = iv.getWidth();
        int imageHeight = iv.getHeight();
        Rect imageRect = new Rect(0, 0, imageWidth, imageHeight);

        // determine destination rectangle
        BitmapDrawable drawable = (BitmapDrawable)iv.getDrawable();
        Bitmap sourceBitmap = drawable.getBitmap();
        Rect bitmapRect = new Rect(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

        // determine source rectangle
        Rect sourceRect = computeSourceRect(imageRect, bitmapRect);

        // here's where we do the magic
        Bitmap scaledBitmap = Bitmap.createBitmap(imageRect.width(), imageRect.height(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(scaledBitmap);
        canvas.drawBitmap(sourceBitmap, sourceRect, imageRect, new Paint());
        iv.setImageBitmap(scaledBitmap);
    }

    private Rect computeSourceRect(Rect imageRect, Rect bitmapRect) {
        float imageWidth = (float) imageRect.width();
        float imageHeight = (float) imageRect.height();
        float bitmapWidth = (float) bitmapRect.width();
        float bitmapHeight = (float) bitmapRect.height();
        float aspectRatioImage = imageWidth / imageHeight;
        float aspectRatioBitmap = bitmapWidth / bitmapHeight;

        if (aspectRatioImage<aspectRatioBitmap) {
            float newWidth = bitmapHeight * aspectRatioImage;
            float widthOffset = (bitmapWidth - newWidth) / 2f;
            return new Rect((int) widthOffset, 0, (int) (widthOffset + newWidth), (int) bitmapHeight);
        }
        else {
            float newHeight = bitmapWidth / aspectRatioImage;
            float heightOffset = (bitmapHeight - newHeight) / 2f;
            // return this for center_crop
            //return new Rect(0, (int) heightOffset, (int) bitmapWidth, (int) (heightOffset + newHeight));
            // return this for bottom align
            return new Rect(0, 0, (int) bitmapWidth, (int) newHeight);
        }
    }

これは基本的に、必要に応じてビットマップを ImageView にスケーリングします (ボタンで動作するように簡単に変更できます)。そのようにして、可能なスケーリングを行うことができます。

于 2013-03-06T20:55:45.887 に答える