本文介绍了安卓:放大的图像,然后行图像当前的缩放的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我使用的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:机器人=http://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中>
解决方案
您只需要工作的位图,看到这个问题类似于你的头痛: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
这篇关于安卓:放大的图像,然后行图像当前的缩放的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!