0

如何在不使用 android 矩阵的情况下缩放图像?

这是我正在使用的代码:

public class SimpImageView extends BaseView{

  private Bitmap image = null;

  private Paint borderPaint = null;

  PointF start = new PointF();
  PointF lastPosition = new PointF();

  Matrix savedMatrix = new Matrix();

  private Paint imagePaint = null;

  private Matrix matrix = null;

  public Bitmap getImage() {
    return image;
  }

  public void setImage(Bitmap image) {
    this.image = image;
  }

  public SimpImageView(Bitmap image,int x,int y,int width,int height){
    super(x, y, width, height);
    this.image = image;
    borderPaint = new Paint();
    borderPaint.setARGB(255, 255, 128, 128);
    borderPaint.setStyle(Paint.Style.STROKE);
    borderPaint.setStrokeWidth(2);
    imagePaint = new Paint();
    imagePaint.setARGB(32, 255, 255, 255);
    imagePaint.setStyle(Paint.Style.FILL);

  }

  /* (non-Javadoc)
   * @see com.simplogics.surfaceview.Views.BaseView#onDraw(android.graphics.Canvas)
   */
  @Override
  public void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    canvas.drawBitmap(image, getBounds().left, getBounds().top, null);

    //        canvas.drawBitmap(image, matrix, new Paint());

    //  canvas.drawBitmap(image, matrix, borderPaint);

    //  canvas.drawRect(getBounds() , borderPaint);
  }

  /* (non-Javadoc)
   * @see com.simplogics.surfaceview.Views.BaseView#onTouchEvent(android.view.MotionEvent)
   */


  static final int NONE = 0;
  static final int DRAG = 1;
  static final int ZOOM = 2;
  int mode = NONE;


  @Override

  public boolean onTouchEvent(MotionEvent event) {
    boolean handled = false;

    Log.d("SimpEditText", "(int)event.getX() " + (int)event.getX());
    Log.d("SimpEditText", "(int)event.getY() " + (int)event.getY());

    if(isTouchedInBounds((int)event.getX(), (int)event.getY())){
      Log.d("SimpEditText", "Touched in Bounds");
      handled = true;
      switch (event.getAction() & MotionEvent.ACTION_MASK) {
      case MotionEvent.ACTION_DOWN:
        start.set(event.getX(), event.getY());
        lastPosition.x = getBounds().left;
        lastPosition.y = getBounds().top;

        Log.d("VerticalLabelView", "mode=DRAG");
        mode = DRAG;
        break;
      case MotionEvent.ACTION_POINTER_DOWN:
        mode = ZOOM;
        Log.d("VerticalLabelView", "mode=ZOOM");
        break;
      case MotionEvent.ACTION_UP:
        mode = NONE;
        break;
      case MotionEvent.ACTION_POINTER_UP:
        mode = NONE;
        Log.d("VerticalLabelView", "mode=NONE");
        break;
      case MotionEvent.ACTION_MOVE:
        if (mode == DRAG) {
          int x = (int)(event.getX() - start.x);
          int y = (int)(event.getY() - start.y);
          setPosition((int)lastPosition.x + x, (int)lastPosition.y + y);
          mode = DRAG;
          break;
        }else if(mode == ZOOM){
          Log.d("SimpImageView", "MODE=ZOOM");
          Log.d("SimpImageView", "getImage().getWidth()="+getImage().getWidth());
          Log.d("SimpImageView"," getImage().getHeight()="+getImage().getHeight());

        }
        break;
      }
    }

    return handled;
  }
}

baseView.java

public abstract class BaseView {

  private int id = -1;

  private Object tag = null;

  private Rect bounds = null;

  public Rect getBounds() {
    return bounds;
  }

  public BaseView() {
    bounds = new Rect();
  }

  public BaseView(int x, int y, int width, int height) {
    bounds = new Rect(x, y, x + width, y + height);
  }

  public abstract void onDraw(Canvas canvas);

  public abstract  boolean onTouchEvent(MotionEvent event);

  public void setBounds(int x, int y, int width, int height){
    bounds.set(x, y, x + width, y + height);
  }

  public void setPosition(int x, int y){
    if(x <= 0 || y <= 0){
      Log.e("SimpEditText1", "----------------------------------------------------------");
      Log.e("SimpEditText1", "-------------0000000000000000000000000000000000------------");
      Log.e("SimpEditText1", "----------------------------------------------------------");
    }
    bounds.set(x, y, x + bounds.width(), y + bounds.height());
  }

  public void setScale(int x,int y,int width,int height){
    bounds.set(x, y, x + bounds.width()+width, y + bounds.height()+height);
  }

  protected boolean isTouchedInBounds(int xPos, int yPos){
    return bounds.contains(xPos, yPos);
  }

  public Object getTag() {
    return tag;
  }

  public void setTag(Object tag) {
    this.tag = tag;
  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  /**
   * @param w
   * @param h
   * @param oldw
   * @param oldh
   */
}
4

0 回答 0