在不使用imageview的情况下在android中缩放和旋转图像

时间:2012-05-28 09:37:57

标签: android

我是Android新手,我想 缩放和旋转我的图片 而不使用Imageview。我可以拖动图像。

代码:

public class SimpImageView extends BaseView{

    private Bitmap image = null;

    private Paint borderPaint = null;

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

    private Matrix savedMatrix = new Matrix();

    private Paint imagePaint = null;

    private Matrix matrix = new Matrix();

    float initialRotation;
    float currentRotation;

    private float initialScale;

    private float currentScale;

    PointF mid = new PointF();
    float oldDist = 1f;

    private Bitmap rotatedImage;




    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;
        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) {


        canvas.drawBitmap(getImage(), getBounds().left,getBounds().top, new Paint());

    }

    /* (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:
                savedMatrix.set(matrix);
                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;

                initialScale = spacing(event);
                midPoint(mid, event);
                Log.d("VerticalLabelView", "mode=ZOOM");
                currentRotation = rotation(event);

                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);

                }else if(mode == ZOOM){

                    currentScale = spacing(event);
                    float scale =currentScale/initialScale;
                      this.image = rotatedImage;
                      this.setScale(0, 0,(int) (getBounds().width()*scale),(int) (getBounds().height()*scale));

                }
                break;
            }


        }




        return handled;

    }


    private float spacing(MotionEvent event) {
        float x = event.getX(0) - event.getX(1);
        float y = event.getY(0) - event.getY(1);
        return FloatMath.sqrt(x * x + y * y);
    }
    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);
    }
    private float rotation(MotionEvent event) {
        double delta_x = (event.getX(0) - event.getX(1));
        double delta_y = (event.getY(0) - event.getY(1));
        double radians = Math.atan2(delta_y, delta_x);
        Log.d("Rotation ~~~~~~~~~~~~~~~~~", delta_x + " ## " + delta_y + " ## "
                + radians + " ## " + Math.toDegrees(radians));
        return (float) Math.toDegrees(radians);
    }

}

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, width,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
     */
}

请告诉我代码中的错误。