android 放大缩小图片

感谢:http://www.xycoding.com/articles/2014/11/21/android-clipimage/

package com.hrloo.mobile.ui;


import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.Rect;
import android.os.Environment;
import android.util.Log;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;

import com.commons.support.widget.TitleBar;
import com.hrloo.mobile.R;
import com.hrloo.mobile.base.BaseNoInitDataActivity;
import com.hrloo.mobile.base.ContentView;

import java.io.File;
import java.io.FileOutputStream;

@ContentView(R.layout.activity_crop_handler)
public class CropHandlerActivity extends BaseNoInitDataActivity {

    private View mSelect;
    private ImageView mImg;
    private RelativeLayout mHandlerLayout;
    float downX, downY;
    int state;
    final int ZOOM = 1, DRAG = 0;
    private int top, left;
    float oldSpacing = 1f;
    private TitleBar mTitleBar;

    /**
     * 记录缩放时两指中间点坐标
     */
    private PointF mid = new PointF();
    private boolean isMain, isPointer;
    private int requestCode;

    @Override
    protected void initView() {
        mTitleBar = getTitleBar();
        mSelect = $T(R.id.crop_handler_select);
        mImg = $T(R.id.crop_handler_img);
        mHandlerLayout = $T(R.id.crop_handler_layout);

        mTitleBar.setRightButton("使用", new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Bitmap bitmap = getBitmap();
                FileOutputStream fos = null;
                String fileName = "cropTemp.jpg";
                try {
                    //判断sd卡是否存在
                    boolean sdCardExist = Environment.getExternalStorageState()
                            .equals(android.os.Environment.MEDIA_MOUNTED);
                    if (sdCardExist) {
                        //获取sdcard的根目录
                        String sdPath = Environment.getExternalStorageDirectory().getPath();

                        //创建程序自己创建的文件夹
                        File tempFile = new File(sdPath + File.separator + fileName);
                        if (!tempFile.exists()) {
                            tempFile.mkdirs();
                        }
                        //创建图片文件
                        File file = new File(sdPath + File.separator + fileName + File.separator + "screen" + ".png");
                        if (!file.exists()) {
                            file.createNewFile();
                        }

                        fos = new FileOutputStream(file);
                        if (fos != null) {
                            bitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);
                            fos.close();
                        }
                        Intent intent = new Intent();
                        intent.putExtra("fileName", file.getAbsolutePath());
                        setResult(RESULT_OK, intent);
                        CropHandlerActivity.this.finish();
                    }
                } catch (Exception e) {
                }
            }
        });
        mImg.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction() & motionEvent.getActionMasked()) {
                    case MotionEvent.ACTION_POINTER_DOWN:
                        //次要点被点击
                        Log.d("CropHandlerActivity", "ACTION_POINTER_DOWN");
                        oldSpacing = spacing(motionEvent);
                        if (oldSpacing > 10f) {
                            isPointer = false;
                            isMain = false;
                            state = ZOOM;
                            midPoint(mid, motionEvent);
                        }
                        break;
                    case MotionEvent.ACTION_POINTER_UP:
                        //次要点松开
                        Log.d("CropHandlerActivity", "ACTION_POINTER_UP");
                        isPointer = true;
                        if (isPointer && isMain) {
                            isPointer = false;
                            isMain = false;
                            state = DRAG;
                            oldSpacing = 1f;
                        }
                        break;
                    case MotionEvent.ACTION_DOWN:
                        Log.d("CropHandlerActivity", "ACTION_DOWN");
                        downX = motionEvent.getX();
                        downY = motionEvent.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        Matrix matrix = mImg.getImageMatrix();
                        if (state == DRAG) {
//                        Log.d("CropHandlerActivity", "ACTION_MOVE:" + (motionEvent.getX() - downX) + "  :" + (motionEvent.getY() - downY));
                            matrix.postTranslate(motionEvent.getX() - downX, motionEvent.getY() - downY);
                            downX = motionEvent.getX();
                            downY = motionEvent.getY();
                        } else if (state == ZOOM && !isPointer && !isMain) {
                            float newSpacing = spacing(motionEvent);
                            float scale = newSpacing / oldSpacing;
                            matrix.postScale(scale, scale, mid.x, mid.y);
                            oldSpacing = newSpacing;
                        }
                        break;
                    case MotionEvent.ACTION_UP:
                        isMain = true;
                        if (isPointer && isMain) {
                            isPointer = false;
                            isMain = false;
                            state = DRAG;
                            oldSpacing = 1f;
                        }
                        break;
                }
                mImg.invalidate();
                return true;
            }
        });
    }

    /**
     * 多点触控时,计算最先放下的两指距离
     *
     * @param event
     * @return
     */
    private float spacing(MotionEvent event) {
        float x = event.getX(0) - event.getX(1);
        float y = event.getY(0) - event.getY(1);
        return (float) Math.sqrt(x * x + y * y);
    }

    /**
     * 多点触控时,计算最先放下的两指中心坐标
     *
     * @param point
     * @param event
     */
    private void midPoint(PointF point, MotionEvent event) {
        float x = event.getX(0) + event.getX(1);
        float y = event.getY(0) + event.getY(1);
        point.set(x / 2, y / 2);
    }

    public static void startThis(Activity context, String fileUri) {
        Intent intent = new Intent(context, CropHandlerActivity.class);
        intent.putExtra("fileUri", fileUri);
        context.startActivityForResult(intent, 88);
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus) {
            int layoutWidth = mHandlerLayout.getWidth();
            int layoutHeight = mHandlerLayout.getHeight();
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.splash);
            int imgWidth = bitmap.getWidth();
            int imgHeight = bitmap.getHeight();

            int selectWidth = mSelect.getWidth();
            int selectHeight = mSelect.getHeight();
            float scaleNum;
            if (imgWidth > imgHeight) {
                scaleNum = (selectWidth * 1.0f) / (imgWidth * 1.0f);
                imgHeight = (int) (scaleNum * imgHeight);
                imgWidth = selectWidth;
            } else {
                scaleNum = (selectHeight * 1.0f) / (imgHeight * 1.0f);
                imgWidth = (int) (scaleNum * imgWidth);
                imgHeight = selectHeight;
            }

            Matrix matrix = new Matrix();
            matrix.postScale(scaleNum, scaleNum);

            top = (layoutHeight - selectHeight) / 2;
            left = (layoutWidth - selectWidth) / 2;
            //平移距离
            matrix.postTranslate((layoutWidth - imgWidth) / 2, (layoutHeight - imgHeight) / 2);
            mImg.setScaleType(ImageView.ScaleType.MATRIX);
            mImg.setImageMatrix(matrix);
            mImg.setImageBitmap(bitmap);

        }
    }

    /**
     * 获取裁剪框内截图
     *
     * @return
     */
    private Bitmap getBitmap() {
        // 获取截屏
        mHandlerLayout.setDrawingCacheEnabled(true);
        mHandlerLayout.buildDrawingCache();

        // 获取状态栏高度
        Rect frame = new Rect();
        this.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
        int borderWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, getResources().getDisplayMetrics());
        RelativeLayout.LayoutParams mLayoutParams = (RelativeLayout.LayoutParams) mImg.getLayoutParams();
        Log.d("getBitmap", "mLayoutParams.topMargin:" + mLayoutParams.topMargin + " mLayoutParams.leftMargin:" + mLayoutParams.leftMargin + "   left:" + left + " top:" + top);
        Bitmap finalBitmap = Bitmap.createBitmap(mHandlerLayout.getDrawingCache(),
                left + borderWidth, top + borderWidth, mSelect.getWidth() - 2 * borderWidth,
                mSelect.getHeight() - 2 * borderWidth);

        // 释放资源
        mHandlerLayout.destroyDrawingCache();
        return finalBitmap;
    }

}
发布了17 篇原创文章 · 获赞 0 · 访问量 3万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览