使用Matrix缩放和旋转图像时FIT_XY不起作用

时间:2014-04-02 19:45:43

标签: android image matrix rotation resize

我试图调整大小并旋转图像,我希望显示完整的图像,而不是图像的裁剪版本。我在图像旁边有一个调整大小按钮,当按下它时执行调整大小/旋转。我尝试将ImageView的缩放类型设置为FIT_XY,然后尝试FIT_CENTER,但图像始终被裁剪,而不是正确缩放。

//MainActivity code
public class MainActivity extends Activity {

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


    RelativeLayout.LayoutParams layoutParamsImage = new RelativeLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

    LinearLayout l1 = new LinearLayout(getApplicationContext());
    LinearLayout l2 = new LinearLayout(getApplicationContext());
    l2.setOrientation(LinearLayout.VERTICAL);

    ImageView imageView = new ImageView(getApplicationContext());

    Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.butterfly);

    imageView.setImageBitmap(bitmap);


    ImageView resizeButton = new ImageView(getApplicationContext());
    resizeButton.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent motionEvent) {
            LinearLayout stickerContainer = (LinearLayout) v.getParent().getParent();
            ImageView stickerImage = (ImageView) stickerContainer.getChildAt(0);

            double r=Math.atan2(motionEvent.getX()-stickerImage.getWidth(), stickerImage.getHeight()-motionEvent.getY());
            int rotation=(int)Math.toDegrees(r);
            int y = (int) motionEvent.getY();
            int x1=0;
            int y1=0;
            if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {

                 x1 = (int) motionEvent.getX();
                 y1= (int) motionEvent.getY();

            }
            else if  (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {

                int x2 = (int) motionEvent.getX();
                int y2= (int) motionEvent.getY();
                        int height = Math.abs(y2-y1) *2;
                int width = Math.abs(x2-x1) *2;
                width = Math.max(width,  100);
                height = Math.max(height,  100);

                width = Math.min(width,  500);
                height = Math.min(height,  500);

                width=height;
                float newRot=new Float(rotation);
                Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.butterfly);
                Matrix matrix=new Matrix();

                matrix.postRotate(newRot,width,height);
                matrix.postScale(2, 2);


                stickerImage.requestLayout();
                stickerImage.getLayoutParams().height = height;
                stickerImage.getLayoutParams().width = width;

                //Bitmap reDrawnBitmap=Bitmap.createBitmap(bitmap,0,0,width, height,matrix,true);
                Bitmap reDrawnBitmap=Bitmap.createBitmap(bitmap,0,0,stickerImage.getWidth(), stickerImage.getHeight(),matrix,true);
                //Bitmap reDrawnBitmap=Bitmap.createScaledBitmap(bitmap, dstWidth, dstHeight, filter)
                stickerImage.setScaleType(ImageView.ScaleType.FIT_XY);    
                stickerImage.setAdjustViewBounds(true);
                stickerImage.setImageBitmap(reDrawnBitmap);
                stickerImage.setScaleType(ImageView.ScaleType.FIT_XY);    


            }

            return true;
        }
    });
    resizeButton.setBackgroundResource(R.drawable.resize);

    layoutParamsImage.height = 100;
    layoutParamsImage.width = 100;
    imageView.setLayoutParams(layoutParamsImage);
    l1.addView(imageView);
    l2.addView(resizeButton);
    l1.addView(l2);

    //imageView.setMaxHeight(100);
    //imageView.setMaxWidth(100);

    container.addView(l1);

}

}

//layout code activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.doodle4.MainActivity"
tools:ignore="MergeRootFrame"></RelativeLayout>

1 个答案:

答案 0 :(得分:0)

我想出了缩放部分。我需要在创建使用矩阵创建的位图后创建缩放的位图。

    else if  (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {

代码块使用此代码而不是底部的代码:

Bitmap reDrawnBitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(), bitmap.getHeight(),matrix,true);
Bitmap reDrawnBitmapRescaled=Bitmap.createScaledBitmap(reDrawnBitmap, width, height, false);
stickerImage.setImageBitmap(reDrawnBitmapRescaled);