支持缩小放大

一.MainActivity

package com.bwie.android_studio_1102_yuan;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

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

        DragImageView mView = new DragImageView(this);
        mView.setmDrawable(getResources().getDrawable(R.mipmap.sz));
        setContentView(mView);
    }
}

二.DragImageView

package com.bwie.android_studio_1102_yuan;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;

/**
 * Created by Administrator on 2017/11/2.
 */

public class DragImageView extends ImageView {
    private Drawable mDrawable;
    private Rect mDrawableRect;
    private Context mContext;
    private float mRation_WH = 0;
    private float mOldX = 0;
    private float mOldY = 0;
    private double mD1;
    private boolean isFirst = true;

    private int NONE = 0;// 无操作
    private int SINGAL_MOVE = 1;// 单点移动
    private int MUTIL_MOVE = 2;// 双点拖拽
    private int mStatus = 0;

    public DragImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

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

    public DragImageView(Context context) {
        super(context);
        this.mContext = context;
        mDrawableRect = new Rect();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // getIntrinsicHeight为返回对象的实际高度
        if (mDrawable == null || mDrawable.getIntrinsicHeight() == 0
                || mDrawable.getIntrinsicWidth() == 0) {
            return;
        }
        setBounds(); // 设置图片
        mDrawable.draw(canvas);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mOldX = event.getX();
                mOldY = event.getY();
                break;
            case MotionEvent.ACTION_UP:
                mStatus = NONE;
                checkBounds();
                break;
            case MotionEvent.ACTION_MOVE:
                if (event.getPointerCount() == 1)
                    mStatus = SINGAL_MOVE;
                else
                    mStatus = MUTIL_MOVE;
                onTouchMove(event);
                break;
            default:
                break;
        }
        return true;
    }

    private void onTouchMove(MotionEvent event) {
        // 判断有几个触摸点
        if (mStatus == SINGAL_MOVE) {
            int offsetWidth = (int) (event.getX() - mOldX);
            int offsetHeight = (int) (event.getY() - mOldY);
            mOldX = event.getX();
            mOldY = event.getY();
            mDrawableRect.offset(offsetWidth, offsetHeight);
            invalidate();
        } else if (mStatus == MUTIL_MOVE) {
            float X0 = event.getX(0);
            float Y0 = event.getY(0);
            float X1 = event.getX(1);
            float Y1 = event.getY(1);
            double mD2 = Math.sqrt(Math.pow(X0 - X1, 2) + Math.pow(Y0 - Y1, 2));

            if (mD1 < mD2) {
                // 放大操作
                if (mDrawableRect.width() < mContext.getResources()
                        .getDisplayMetrics().widthPixels * 2) {
                    int offsetwidth = 10;
                    int offsettop = (int) (offsetwidth / mRation_WH);
                    mDrawableRect.set(mDrawableRect.left - offsetwidth,
                            mDrawableRect.top - offsettop, mDrawableRect.right
                                    + offsetwidth, mDrawableRect.bottom
                                    + offsettop);
                    invalidate();
                }

            } else {
                // 设置为只能缩小为屏幕的1/3,可以根据需要自己调整
                if (mDrawableRect.width() > mContext.getResources()
                        .getDisplayMetrics().widthPixels / 3) {
                    int offsetwidth = 10;
                    int offsettop = (int) (offsetwidth / mRation_WH);
                    mDrawableRect.set(mDrawableRect.left + offsetwidth,
                            mDrawableRect.top + offsettop, mDrawableRect.right
                                    - offsetwidth, mDrawableRect.bottom
                                    - offsettop);
                    invalidate();
                }
            }
            mD1 = mD2;
        }

    }

    /**
     * 设置mDrawable
     */
    public void setBounds() {
        if (isFirst) {
            // 图片宽高比
            mRation_WH = (float) mDrawable.getIntrinsicWidth()
                    / (float) mDrawable.getIntrinsicHeight();
            // 取屏幕宽和图片宽较小的一个
            int px_w = Math.min(getWidth(),
                    dp2px(mContext, mDrawable.getIntrinsicWidth()));
            int px_h = (int) (px_w / mRation_WH);// 获得图片高
            int left = (getWidth() - px_w) / 2;
            int top = (getHeight() - px_h) / 2;
            int right = px_w + left;
            int bottom = px_h + top;
            mDrawableRect.set(left, top, right, bottom);
            isFirst = false;
        }
        mDrawable.setBounds(mDrawableRect);

    }

    /**
     * 检测边框范围
     */
    public void checkBounds() {
        int newLeft = mDrawableRect.left;
        int newTop = mDrawableRect.top;
        boolean isChange = false;
        // 向左移动范围<=屏幕宽度
        if (newLeft < -mDrawableRect.width()) {
            newLeft = -mDrawableRect.width();
            isChange = true;
        }
        // 向上移动范围<=屏幕高度
        if (newTop < -mDrawableRect.height()) {
            newTop = -mDrawableRect.height();
            isChange = true;
        }
        // 向右移动范围<=屏幕宽度
        if (newLeft > getWidth()) {
            newLeft = getWidth();
            isChange = true;
        }
        // 向下移动范围<=屏幕高度
        if (newTop > getHeight()) {
            newTop = getHeight();
            isChange = true;
        }
        if (isChange) {
            mDrawableRect.offsetTo(newLeft, newTop);
            invalidate();
        }
    }

    public Drawable getmDrawable() {
        return mDrawable;
    }

    public void setmDrawable(Drawable mDrawable) {
        this.mDrawable = mDrawable;
    }

    /**
     * 将dp单位换算成px
     * @param context
     * @param value
     * @return
     */
    public int dp2px(Context context, int value) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (value * scale + 0.5f);
    }

}


activity_main

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <com.bwie.android_studio_1102_yuan.DragImageView

        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值