安卓:放大的图像,然后行图像当前的缩放 [英] Android : Zoom Image And Draw line on image with current zoom

查看:148
本文介绍了安卓:放大的图像,然后行图像当前的缩放的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的ImageView支持zooming.Right我现在扩展的ImageView这样我就可以在画布上绘制。目前,我有setImageResource设置绘制和中的OnDraw(画布);我画一些线条上的路径,然后绘制的画布上。

现在的问题是,当我尝试缩放,图像缩放完美,但被绘制在画布上绘制未缩放。它只是停留的地方。

 步骤
 - 第一屏幕图像视图
 - 缩小ImageView的。
 - 现在绘制的图像像签名,线,圆等
 - 然后,当缩小在那个时候应该是显示当你画的对象。

//单音类
公共类AppController的扩展应用{

//说理的地方申报日志标签应用程序
公共静态最后弦乐LOG_TAG = AppController.class.getName();

//实例
私有静态AppController的实例= NULL;

公共静态的AppController的getInstance(){
    checkInstance();
    返回实例;
}

私有静态无效checkInstance(){
    如果(例如== NULL)
        抛出新IllegalStateException异常(应用程序尚未创建的!);
}

@覆盖
公共无效的onCreate(){
    super.onCreate();
    例如=这一点;
}

}

//自定义的ImageView
进口java.io.ByteArrayOutputStream中;
进口android.annotation.Sup pressLint;
进口android.content.Context;
进口android.graphics.Bitmap;
进口android.graphics.BitmapFactory;
进口android.graphics.Canvas;
进口android.graphics.Color;
进口android.graphics.Matrix;
进口android.graphics.Paint;
进口android.graphics.Path;
进口android.graphics.RectF;
进口android.graphics.drawable.Drawable;
进口android.util.AttributeSet;
进口android.util.FloatMath;
进口android.view.GestureDetector;
进口android.view.MotionEvent;
进口android.view.View;
进口android.view.View.OnTouchListener;
进口android.widget.ImageView;

公共类ScaleImageView扩展ImageView的实现OnTouchListener {

静态最终浮动STROKE_WIDTH = 10F;
静态最终浮动HALF_STROKE_WIDTH = STROKE_WIDTH / 2;

浮动lastTouchX;
浮动lastTouchY;
最后RectF dirtyRect =新RectF();

私人语境mContext;
私人浮动MAX_SCALE = 2F;

私有静态矩阵mMatrix;
私人最终浮动[] mMatrixValues​​ =新的浮动[9];

//显示宽度高度。
私人诠释mWidth;
私人诠释mHeight;

私人诠释mIntrinsicWidth;
私人诠释mIntrinsicHeight;

私人浮动mScale;
私人浮动mMinScale;

私人浮动米prevDistance;
私人布尔isScaling;

私人诠释米prevMoveX;
私人诠释米prevMoveY;
私人GestureDetector mDetector;

涂料粉刷=新的油漆();
公共静态路径path =新路径();

公共静态INT imageheight,ImageWidth等;

字符串变量=ScaleImageView;

公共ScaleImageView(上下文的背景下,的AttributeSet attr)使用{
    超(背景下,ATTR);
    this.mContext =背景;
    初始化();
}

公共ScaleImageView(上下文的背景下){
    超(上下文);
    this.mContext =背景;
    初始化();
}

私人无效resetDirtyRect(浮动eventX,浮eventY){
    dirtyRect.left = Math.min(lastTouchX,eventX);
    dirtyRect.right = Math.max(lastTouchX,eventX);
    dirtyRect.top = Math.min(lastTouchY,eventY);
    dirtyRect.bottom = Math.max(lastTouchY,eventY);
}

@覆盖
公共无效setImageBitmap(位图BM){
    super.setImageBitmap(BM);
    this.initialize();
}

@覆盖
公共无效setImageResource(INT渣油){
    super.setImageResource(渣油);
    this.initialize();
}

私人无效初始化(){
    this.setScaleType(ScaleType.MATRIX);
    this.mMatrix =新的Matrix();
    绘制对象D = getDrawable();

    paint.setAntiAlias​​(真正的);
    paint.setColor(Color.RED);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeWidth(STROKE_WIDTH);

    如果(D!= NULL){
        mIntrinsicWidth = d.getIntrinsicWidth();
        mIntrinsicHeight = d.getIntrinsicHeight();
        setOnTouchListener(本);
    }
    mDetector =新GestureDetector(mContext,
            新GestureDetector.SimpleOnGestureListener(){
                @覆盖
                公共布尔onDoubleTap(MotionEvent E){
                    maxZoomTo((int)的e.getX(),(int)的e.getY());
                    切割();
                    返回super.onDoubleTap(E);
                }
            });

}

@覆盖
保护布尔的setFrame(INT L,INT T,INT R,int b)在{
    mWidth = R  -  1;
    mHeight = B  - 吨;

    mMatrix.reset();
    INT r_norm = R  -  1;
    mScale =(浮点)r_norm /(浮点)mIntrinsicWidth;

    INT paddingHeight = 0;
    INT paddingWidth = 0;
    //缩放垂直
    如果(mScale * mIntrinsicHeight> mHeight){
        mScale =(浮点)mHeight /(浮点)mIntrinsicHeight;
        mMatrix.postScale(mScale,mScale);
        paddingWidth =(R  -  mWidth)/ 2;
        paddingHeight = 0;
        //缩放水平
    } 其他 {
        mMatrix.postScale(mScale,mScale);
        paddingHeight =(二 -  mHeight)/ 2;
        paddingWidth = 0;
    }
    mMatrix.postTranslate(paddingWidth,paddingHeight);

    setImageMatrix(mMatrix);
    mMinScale = mScale;
    zoomTo(mScale,mWidth / 2,mHeight / 2);
    切割();
    返回super.setFrame(L,T,R,B);
}

保护浮动的getValue(矩阵矩阵,诠释whichValue){
    matrix.getValues​​(mMatrixValues​​);
    返回mMatrixValues​​ [whichValue]
}

保护浮动中的getScale(){
    返回的getValue(mMatrix,Matrix.MSCALE_X);
}

公众持股量getTranslateX(){
    返回的getValue(mMatrix,Matrix.MTRANS_X);
}

保护浮动getTranslateY(){
    返回的getValue(mMatrix,Matrix.MTRANS_Y);
}

保护无效maxZoomTo(INT X,int y)对{
    如果(mMinScale =的getScale()及及(的getScale() -  mMinScale)GT;!0.1F){
        //门槛0.1F
        浮规模= mMinScale /中的getScale();
        zoomTo(规模,X,Y);
    } 其他 {
        浮规模= MAX_SCALE /中的getScale();
        zoomTo(规模,X,Y);
    }
}

公共无效zoomTo(浮点规模,诠释的x,int y)对{
    如果(中的getScale()*规模和LT; mMinScale){
        返回;
    }
    如果(规模> = 1&安培;&安培;中的getScale()*规模> MAX_SCALE){
        返回;
    }
    mMatrix.postScale(秤,秤);
    //移动到中心
    mMatrix.postTranslate( - (mWidth *标度 -  mWidth)/ 2,
             - (mHeight *规模 -  mHeight)/ 2);

    //移动x和y的距离
    mMatrix.postTranslate( - (X  - (mWidth / 2))*标度,0);
    mMatrix.postTranslate(0, - (Y  - (mHeight / 2))*标度);
    setImageMatrix(mMatrix);
}

公共无效切割(){
    INT宽度=(int)的(mIntrinsicWidth *的getScale());
    INT高度=(int)的(mIntrinsicHeight *的getScale());

    ImageWidth等=宽度;
    imageheight =高度;

    如果(getTranslateX()<  - (宽 -  mWidth)){
        mMatrix.postTranslate( - (getTranslateX()+宽 -  mWidth),0);
    }
    如果(getTranslateX()大于0){
        mMatrix.postTranslate(-getTranslateX(),0);
    }
    如果(getTranslateY()<  - (高度 -  mHeight)){
        mMatrix.postTranslate(0, - (getTranslateY()+高 -  mHeight));
    }
    如果(getTranslateY()大于0){
        mMatrix.postTranslate(0,-getTranslateY());
    }
    如果(宽度LT; mWidth){
        mMatrix.postTranslate((mWidth  - 宽度)/ 2,0);
    }
    如果(高度< mHeight){
        mMatrix.postTranslate(0,(mHeight  - 高度)/ 2);
    }
    setImageMatrix(mMatrix);
}

私人浮动距离(浮动X0,X1浮球,浮球Y0,Y1浮动){
    浮动X = X0  -  X1;
    浮动Y = Y0  -  Y1;
    返回FloatMath.sqrt(X * X + Y * Y);
}

私人浮动dispDistance(){
    返回FloatMath.sqrt(mWidth * mWidth + mHeight * mHeight);
}

公共无效清除(){
    path.reset();
    无效();
}

公共静态无效保存(){

    位图returnedBitmap = Bitmap.createBitmap(
            ScaleImageViewActivity.imageview.getWidth(),
            ScaleImageViewActivity.imageview.getHeight(),
            Bitmap.Config.ARGB_8888);
    帆布油画=新的Canvas(returnedBitmap);

    可绘制bgDrawable = ScaleImageViewActivity.imageview.getDrawable();

    如果(bgDrawable!= NULL)
        bgDrawable.draw(画布);
    其他
        canvas.drawColor(Color.WHITE);

    ScaleImageViewActivity.imageview.draw(画布);

    ByteArrayOutputStream BS =新ByteArrayOutputStream();
    returnedBitmap.com preSS(Bitmap.Com pressFormat.PNG,50,BS);

    位图FinalBitmap = BitmapFactory.de codeByteArray(bs.toByteArray(),0,
            bs.toByteArray()的长度)。

    ScaleImageViewActivity.imageview.setImageBitmap(FinalBitmap);
    path.reset();

    // ScaleImageViewActivity.imageview.setImageMatrix(mMatrix);

}

@燮pressLint(ClickableViewAccessibility)
@覆盖
公共布尔的onTouchEvent(MotionEvent事件){
    如果(!ScaleImageViewActivity.flag){

        如果(mDetector.onTouchEvent(事件)){
            返回true;
        }
        INT touchCount = event.getPointerCount();
        开关(event.getAction()){
        案例MotionEvent.ACTION_DOWN:
        案例MotionEvent.ACTION_POINTER_1_DOWN:
        案例MotionEvent.ACTION_POINTER_2_DOWN:
            如果(touchCount> = 2){
                浮距离=距离(event.getX(0),event.getX(1),
                        event.getY(0),event.getY(1));
                米prevDistance =距离;
                isScaling = TRUE;
            } 其他 {
                米prevMoveX =(INT)event.getX();
                米prevMoveY =(INT)event.getY();
            }
        案例MotionEvent.ACTION_MOVE:
            如果(touchCount> = 2&安培;&安培; isScaling){
                浮DIST =距离(event.getX(0),event.getX(1),
                        event.getY(0),event.getY(1));
                浮规模=(DIST  - 米prevDistance)/ dispDistance();
                米prevDistance = DIST;
                规模+ = 1;
                规模=秤*规模;
                zoomTo(规模,mWidth / 2,mHeight / 2);
                切割();
            }否则,如果(!isScaling){
                INT distanceX = M prevMoveX  - (INT)event.getX();
                INT distanceY = M prevMoveY  - (INT)event.getY();
                米prevMoveX =(INT)event.getX();
                米prevMoveY =(INT)event.getY();
                mMatrix.postTranslate(-distanceX,-distanceY);
                切割();
            }
            打破;
        案例MotionEvent.ACTION_UP:
        案例MotionEvent.ACTION_POINTER_UP:
        案例MotionEvent.ACTION_POINTER_2_UP:
            如果(event.getPointerCount()&其中; = 1){
                isScaling = FALSE;
            }
            打破;
        }
    } 其他 {
        浮eventX = event.getX();
        浮eventY = event.getY();

        开关(event.getAction()){
        案例MotionEvent.ACTION_DOWN:
            path.moveTo(eventX,eventY);
            lastTouchX = eventX;
            lastTouchY = eventY;
            返回true;

        案例MotionEvent.ACTION_MOVE:

        案例MotionEvent.ACTION_UP:

            resetDirtyRect(eventX,eventY);
            INT historySize = event.getHistorySize();
            的for(int i = 0; I< historySize;我++){
                浮historicalX = event.getHistoricalX(ⅰ);
                浮historicalY = event.getHistoricalY(ⅰ);
                path.lineTo(historicalX,historicalY);
            }
            path.lineTo(eventX,eventY);
            打破;
        }

        无效((INT)(dirtyRect.left  -  HALF_STROKE_WIDTH)
                (INT)(dirtyRect.top  -  HALF_STROKE_WIDTH)
                (INT)(dirtyRect.right + HALF_STROKE_WIDTH)
                (中间体)(dirtyRect.bottom + HALF_STROKE_WIDTH));

        lastTouchX = eventX;
        lastTouchY = eventY;
    }
    返回true;
}

@覆盖
保护无效的OnDraw(帆布油画){
    // TODO自动生成方法存根
    super.onDraw(画布);
    如果(ScaleImageViewActivity.flag)
        canvas.drawPath(路径,油漆);
}

@燮pressLint(ClickableViewAccessibility)
@覆盖
公共布尔onTouch(视图V,MotionEvent事件){
    返回super.onTouchEvent(事件);
}

}

//活动

进口android.app.Activity;
进口android.os.Bundle;
进口android.view.View;
进口android.view.View.OnClickListener;
进口android.widget.Button;

公共类ScaleImageViewActivity扩展活动实现OnClickListener {

按钮btndraw,btnzoom,btnsave;

公共静态ScaleImageView ImageView的;
公共静态布尔标志=真;

@覆盖
公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.main);
    initwidget();
}

私人无效initwidget(){

    ImageView的=(ScaleImageView)findViewById(R.id.image);

    btnsave =(按钮)findViewById(R.id.activity_main_save);
    btndraw =(按钮)findViewById(R.id.activity_main_zoom_draw);
    btnzoom =(按钮)findViewById(R.id.activity_main_zoom_zoom);

    btndraw.setOnClickListener(本);
    btnzoom.setOnClickListener(本);
    btnsave.setOnClickListener(本);
}

@覆盖
公共无效的onClick(查看为arg0){
    // TODO自动生成方法存根
    如果(btndraw.equals(arg0中)){
        标志=真正的;
    }否则,如果(btnzoom.equals(arg0中)){
        标志= FALSE;
    }否则,如果(btnsave.equals(arg0中)){
        ScaleImageView.save();
    }
}
}
 

main.xml中

 < XML版本=1.0编码=UTF-8&GT?;
< LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT
机器人:方向=垂直>

<的LinearLayout
    机器人:layout_width =FILL_PARENT
    机器人:layout_height =WRAP_CONTENT>

    <按钮
        机器人:ID =@ + ID / activity_main_zoom_zoom
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:文本=放大/>

    <按钮
        机器人:ID =@ + ID / activity_main_zoom_draw
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:文本=画/>

    <按钮
        机器人:ID =@ + ID / activity_main_save
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:文本=保存/>
< / LinearLayout中>

< com.matabii.dev.scaleimageview.ScaleImageView
    机器人:ID =@ + ID /图像
    机器人:layout_width =FILL_PARENT
    机器人:layout_height =FILL_PARENT
    机器人:SRC =@可绘制/样品/>

< / LinearLayout中>
 

解决方案

您只需要工作的位图,看到这个问题类似于你的头痛:<一href="http://stackoverflow.com/questions/7902867/how-to-draw-a-circle-after-zoom-in-android">Link

I am using ImageView support zooming.Right now I am extending the ImageView so i can draw on canvas . Currently i Have setImageResource setting a drawable and In onDraw(canvas); i am drawing some line over a path then drawing that over the canvas.

The problem is when i try zooming, the image zooms perfectly but the drawing that was drawn over the canvas is not zooming. it just stays in place.

Steps
-  First screen Image view
- Zoom Imageview.
- Now Draw on Image like signature,line,circle etc
- Then when zoom out at that time it should be display when you draw object. 

// Single Tone class
public class AppController extends Application {

// sensible place to declare a log tag for the application
public static final String LOG_TAG = AppController.class.getName();

// instance
private static AppController instance = null;

public static AppController getInstance() {
    checkInstance();
    return instance;
}

private static void checkInstance() {
    if (instance == null)
        throw new IllegalStateException("Application not created yet!");
}

@Override
public void onCreate() {
    super.onCreate();
    instance = this;
}

}

//CUSTOM IMAGEVIEW
import java.io.ByteArrayOutputStream;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.FloatMath;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class ScaleImageView extends ImageView implements OnTouchListener {

static final float STROKE_WIDTH = 10f;
static final float HALF_STROKE_WIDTH = STROKE_WIDTH / 2;

float lastTouchX;
float lastTouchY;
final RectF dirtyRect = new RectF();

private Context mContext;
private float MAX_SCALE = 2f;

private static Matrix mMatrix;
private final float[] mMatrixValues = new float[9];

// display width height.
private int mWidth;
private int mHeight;

private int mIntrinsicWidth;
private int mIntrinsicHeight;

private float mScale;
private float mMinScale;

private float mPrevDistance;
private boolean isScaling;

private int mPrevMoveX;
private int mPrevMoveY;
private GestureDetector mDetector;

Paint paint = new Paint();
public static Path path = new Path();

public static int imageheight, imagewidth;

String TAG = "ScaleImageView";

public ScaleImageView(Context context, AttributeSet attr) {
    super(context, attr);
    this.mContext = context;
    initialize();
}

public ScaleImageView(Context context) {
    super(context);
    this.mContext = context;
    initialize();
}

private void resetDirtyRect(float eventX, float eventY) {
    dirtyRect.left = Math.min(lastTouchX, eventX);
    dirtyRect.right = Math.max(lastTouchX, eventX);
    dirtyRect.top = Math.min(lastTouchY, eventY);
    dirtyRect.bottom = Math.max(lastTouchY, eventY);
}

@Override
public void setImageBitmap(Bitmap bm) {
    super.setImageBitmap(bm);
    this.initialize();
}

@Override
public void setImageResource(int resId) {
    super.setImageResource(resId);
    this.initialize();
}

private void initialize() {
    this.setScaleType(ScaleType.MATRIX);
    this.mMatrix = new Matrix();
    Drawable d = getDrawable();

    paint.setAntiAlias(true);
    paint.setColor(Color.RED);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeWidth(STROKE_WIDTH);

    if (d != null) {
        mIntrinsicWidth = d.getIntrinsicWidth();
        mIntrinsicHeight = d.getIntrinsicHeight();
        setOnTouchListener(this);
    }
    mDetector = new GestureDetector(mContext,
            new GestureDetector.SimpleOnGestureListener() {
                @Override
                public boolean onDoubleTap(MotionEvent e) {
                    maxZoomTo((int) e.getX(), (int) e.getY());
                    cutting();
                    return super.onDoubleTap(e);
                }
            });

}

@Override
protected boolean setFrame(int l, int t, int r, int b) {
    mWidth = r - l;
    mHeight = b - t;

    mMatrix.reset();
    int r_norm = r - l;
    mScale = (float) r_norm / (float) mIntrinsicWidth;

    int paddingHeight = 0;
    int paddingWidth = 0;
    // scaling vertical
    if (mScale * mIntrinsicHeight > mHeight) {
        mScale = (float) mHeight / (float) mIntrinsicHeight;
        mMatrix.postScale(mScale, mScale);
        paddingWidth = (r - mWidth) / 2;
        paddingHeight = 0;
        // scaling horizontal
    } else {
        mMatrix.postScale(mScale, mScale);
        paddingHeight = (b - mHeight) / 2;
        paddingWidth = 0;
    }
    mMatrix.postTranslate(paddingWidth, paddingHeight);

    setImageMatrix(mMatrix);
    mMinScale = mScale;
    zoomTo(mScale, mWidth / 2, mHeight / 2);
    cutting();
    return super.setFrame(l, t, r, b);
}

protected float getValue(Matrix matrix, int whichValue) {
    matrix.getValues(mMatrixValues);
    return mMatrixValues[whichValue];
}

protected float getScale() {
    return getValue(mMatrix, Matrix.MSCALE_X);
}

public float getTranslateX() {
    return getValue(mMatrix, Matrix.MTRANS_X);
}

protected float getTranslateY() {
    return getValue(mMatrix, Matrix.MTRANS_Y);
}

protected void maxZoomTo(int x, int y) {
    if (mMinScale != getScale() && (getScale() - mMinScale) > 0.1f) {
        // threshold 0.1f
        float scale = mMinScale / getScale();
        zoomTo(scale, x, y);
    } else {
        float scale = MAX_SCALE / getScale();
        zoomTo(scale, x, y);
    }
}

public void zoomTo(float scale, int x, int y) {
    if (getScale() * scale < mMinScale) {
        return;
    }
    if (scale >= 1 && getScale() * scale > MAX_SCALE) {
        return;
    }
    mMatrix.postScale(scale, scale);
    // move to center
    mMatrix.postTranslate(-(mWidth * scale - mWidth) / 2,
            -(mHeight * scale - mHeight) / 2);

    // move x and y distance
    mMatrix.postTranslate(-(x - (mWidth / 2)) * scale, 0);
    mMatrix.postTranslate(0, -(y - (mHeight / 2)) * scale);
    setImageMatrix(mMatrix);
}

public void cutting() {
    int width = (int) (mIntrinsicWidth * getScale());
    int height = (int) (mIntrinsicHeight * getScale());

    imagewidth = width;
    imageheight = height;

    if (getTranslateX() < -(width - mWidth)) {
        mMatrix.postTranslate(-(getTranslateX() + width - mWidth), 0);
    }
    if (getTranslateX() > 0) {
        mMatrix.postTranslate(-getTranslateX(), 0);
    }
    if (getTranslateY() < -(height - mHeight)) {
        mMatrix.postTranslate(0, -(getTranslateY() + height - mHeight));
    }
    if (getTranslateY() > 0) {
        mMatrix.postTranslate(0, -getTranslateY());
    }
    if (width < mWidth) {
        mMatrix.postTranslate((mWidth - width) / 2, 0);
    }
    if (height < mHeight) {
        mMatrix.postTranslate(0, (mHeight - height) / 2);
    }
    setImageMatrix(mMatrix);
}

private float distance(float x0, float x1, float y0, float y1) {
    float x = x0 - x1;
    float y = y0 - y1;
    return FloatMath.sqrt(x * x + y * y);
}

private float dispDistance() {
    return FloatMath.sqrt(mWidth * mWidth + mHeight * mHeight);
}

public void clear() {
    path.reset();
    invalidate();
}

public static void save() {

    Bitmap returnedBitmap = Bitmap.createBitmap(
            ScaleImageViewActivity.imageview.getWidth(),
            ScaleImageViewActivity.imageview.getHeight(),
            Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(returnedBitmap);

    Drawable bgDrawable = ScaleImageViewActivity.imageview.getDrawable();

    if (bgDrawable != null)
        bgDrawable.draw(canvas);
    else
        canvas.drawColor(Color.WHITE);

    ScaleImageViewActivity.imageview.draw(canvas);

    ByteArrayOutputStream bs = new ByteArrayOutputStream();
    returnedBitmap.compress(Bitmap.CompressFormat.PNG, 50, bs);

    Bitmap FinalBitmap = BitmapFactory.decodeByteArray(bs.toByteArray(), 0,
            bs.toByteArray().length);

    ScaleImageViewActivity.imageview.setImageBitmap(FinalBitmap);
    path.reset();

    // ScaleImageViewActivity.imageview.setImageMatrix(mMatrix);

}

@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event) {
    if (!ScaleImageViewActivity.flag) {

        if (mDetector.onTouchEvent(event)) {
            return true;
        }
        int touchCount = event.getPointerCount();
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_POINTER_1_DOWN:
        case MotionEvent.ACTION_POINTER_2_DOWN:
            if (touchCount >= 2) {
                float distance = distance(event.getX(0), event.getX(1),
                        event.getY(0), event.getY(1));
                mPrevDistance = distance;
                isScaling = true;
            } else {
                mPrevMoveX = (int) event.getX();
                mPrevMoveY = (int) event.getY();
            }
        case MotionEvent.ACTION_MOVE:
            if (touchCount >= 2 && isScaling) {
                float dist = distance(event.getX(0), event.getX(1),
                        event.getY(0), event.getY(1));
                float scale = (dist - mPrevDistance) / dispDistance();
                mPrevDistance = dist;
                scale += 1;
                scale = scale * scale;
                zoomTo(scale, mWidth / 2, mHeight / 2);
                cutting();
            } else if (!isScaling) {
                int distanceX = mPrevMoveX - (int) event.getX();
                int distanceY = mPrevMoveY - (int) event.getY();
                mPrevMoveX = (int) event.getX();
                mPrevMoveY = (int) event.getY();
                mMatrix.postTranslate(-distanceX, -distanceY);
                cutting();
            }
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
        case MotionEvent.ACTION_POINTER_2_UP:
            if (event.getPointerCount() <= 1) {
                isScaling = false;
            }
            break;
        }
    } else {
        float eventX = event.getX();
        float eventY = event.getY();

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            path.moveTo(eventX, eventY);
            lastTouchX = eventX;
            lastTouchY = eventY;
            return true;

        case MotionEvent.ACTION_MOVE:

        case MotionEvent.ACTION_UP:

            resetDirtyRect(eventX, eventY);
            int historySize = event.getHistorySize();
            for (int i = 0; i < historySize; i++) {
                float historicalX = event.getHistoricalX(i);
                float historicalY = event.getHistoricalY(i);
                path.lineTo(historicalX, historicalY);
            }
            path.lineTo(eventX, eventY);
            break;
        }

        invalidate((int) (dirtyRect.left - HALF_STROKE_WIDTH),
                (int) (dirtyRect.top - HALF_STROKE_WIDTH),
                (int) (dirtyRect.right + HALF_STROKE_WIDTH),
                (int) (dirtyRect.bottom + HALF_STROKE_WIDTH));

        lastTouchX = eventX;
        lastTouchY = eventY;
    }
    return true;
}

@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    super.onDraw(canvas);
    if (ScaleImageViewActivity.flag)
        canvas.drawPath(path, paint);
}

@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
    return super.onTouchEvent(event);
}

}

//ACTIVITY

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class ScaleImageViewActivity extends Activity implements OnClickListener {

Button btndraw, btnzoom, btnsave;

public static ScaleImageView imageview;
public static boolean flag = true;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    initwidget();
}

private void initwidget() {

    imageview = (ScaleImageView) findViewById(R.id.image);

    btnsave = (Button) findViewById(R.id.activity_main_save);
    btndraw = (Button) findViewById(R.id.activity_main_zoom_draw);
    btnzoom = (Button) findViewById(R.id.activity_main_zoom_zoom);

    btndraw.setOnClickListener(this);
    btnzoom.setOnClickListener(this);
    btnsave.setOnClickListener(this);
}

@Override
public void onClick(View arg0) {
    // TODO Auto-generated method stub
    if (btndraw.equals(arg0)) {
        flag = true;
    } else if (btnzoom.equals(arg0)) {
        flag = false;
    } else if (btnsave.equals(arg0)) {
        ScaleImageView.save();
    }
}
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <Button
        android:id="@+id/activity_main_zoom_zoom"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Zoom" />

    <Button
        android:id="@+id/activity_main_zoom_draw"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Draw" />

    <Button
        android:id="@+id/activity_main_save"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Save" />
</LinearLayout>

<com.matabii.dev.scaleimageview.ScaleImageView
    android:id="@+id/image"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:src="@drawable/sample" />

</LinearLayout>

解决方案

You just need to work on bitmap, See this issue similar to your headache : Link

这篇关于安卓:放大的图像,然后行图像当前的缩放的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆