Putting some indicator around the image in image move/resize/rotate operations

前端 未结 8 1325
终归单人心
终归单人心 2021-01-30 13:54

I would like to Scale, Move, Resize Image. I would like to surround the image with Indicators which guide user what operation these indicators perform i.e. Moving, Rotating, S

相关标签:
8条回答
  • 2021-01-30 14:28

    Just check out this image cropping reference :

    http://www.londatiga.net/featured-articles/how-to-select-and-crop-image-on-android/

    For image rotation, just refer to this example; this sample code represents the rotation of image dynamically:

    http://android-er.blogspot.in/2010/07/rotate-bitmap-image-using-matrix.html

    This link is also useful for image crop, rotate and scale:

    https://github.com/Yalantis/uCrop

    0 讨论(0)
  • 2021-01-30 14:30

    You can use Matrix transaformation to achieve rotating, scaling, and moving....I hope this will help you....

    for rotating

    Matrix matrix = new Matrix();
        matrix.postRotate(90);
    

    for scaling

     matrix.postScale(scaleWidth, scaleHeight);
    

    create new bitmap without changing the original one...like this

    Bitmap bmp2 = Bitmap.createBitmap(bmp1, 0, 0, pow2, pow2, matrix, true);
    
    0 讨论(0)
  • 2021-01-30 14:31

    I know this is not an answer but it's worth mentioning.

    Take a look at this project. I intend to put it on GitHub but it is not done yet (at all).

    There is a button to rotate the image. I am still working on the "save". Many of the classes are taken from the Android source thanks to Lorenzo Villani's project

    Add to your project's manifest:

        <activity
            android:name="mobi.sherif.camera.CropImage"
            android:hardwareAccelerated="false"
            android:screenOrientation="portrait" >
    

    Call the activity using:

    Intent intent = new Intent(mContext, CropImage.class);
    intent.setData(uri);
    startActivityForResult(intent, S.request.cropimage);
    

    enter image description here

    0 讨论(0)
  • 2021-01-30 14:37

    I recently tried the same thing but ended up using a library since it covered a lot more edge cases. This is a great, and pretty widely used library:

    http://code.google.com/p/android-multitouch-controller/

    0 讨论(0)
  • 2021-01-30 14:37

    Bitmap rotation

    Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, targetHeight, config);
    Canvas canvas = new Canvas(targetBitmap);
    Matrix matrix = new Matrix();
    matrix.setRotate(mRotation,source.getWidth()/2,source.getHeight()/2);
    canvas.drawBitmap(source, matrix, new Paint());
    

    Image Scaling Scaling

    AssetManager assetManager = context.getAssets();
    InputStream imageIn;
    String imgPath = "test.png";
    Bitmap image;
    try {
        imageIn = assetManager.open(imgPath, AssetManager.ACCESS_BUFFER);
        image = BitmapFactory.decodeStream(imageIn);
    } catch (IOException e) {
    
    }
    //TODO: calculate width and height to fill or fit screen
    image = Bitmap.createScaledBitmap(image, width, height, true);
    

    Image moving Image in Canvas with touch events

    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.drawable.BitmapDrawable;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.ScaleGestureDetector;
    import android.view.View;
    
    public class ImgView extends View {
    
    private static final int INVALID_POINTER_ID = -1;
    
        private Drawable mImage;
        private float mPosX;
        private float mPosY;
    
        private float mLastTouchX;
        private float mLastTouchY;
        private int mActivePointerId = INVALID_POINTER_ID;
    
        private ScaleGestureDetector mScaleDetector;
        private float mScaleFactor = 1.f;
    
        public ImgView(Context context) {
            this(context, null, 0);
        mImage = getResources().getDrawable(R.drawable.imagename);
    
            mImage.setBounds(0, 0, mImage.getIntrinsicWidth(), mImage.getIntrinsicHeight());
        }
    
        public ImgView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public ImgView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            // Let the ScaleGestureDetector inspect all events.
            mScaleDetector.onTouchEvent(ev);
    
            final int action = ev.getAction();
            switch (action & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN: {
                final float x = ev.getX();
                final float y = ev.getY();
    
                mLastTouchX = x;
                mLastTouchY = y;
                mActivePointerId = ev.getPointerId(0);
                break;
            }
    
            case MotionEvent.ACTION_MOVE: {
                final int pointerIndex = ev.findPointerIndex(mActivePointerId);
                final float x = ev.getX(pointerIndex);
                final float y = ev.getY(pointerIndex);
    
                // Only move if the ScaleGestureDetector isn't processing a gesture.
                if (!mScaleDetector.isInProgress()) {
                    final float dx = x - mLastTouchX;
                    final float dy = y - mLastTouchY;
    
                    mPosX += dx;
                    mPosY += dy;
    
                    invalidate();
                }
    
                mLastTouchX = x;
                mLastTouchY = y;
    
                break;
            }
    
            case MotionEvent.ACTION_UP: {
                mActivePointerId = INVALID_POINTER_ID;
                break;
            }
    
            case MotionEvent.ACTION_CANCEL: {
                mActivePointerId = INVALID_POINTER_ID;
                break;
            }
    
            case MotionEvent.ACTION_POINTER_UP: {
                final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) 
                        >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
                final int pointerId = ev.getPointerId(pointerIndex);
                if (pointerId == mActivePointerId) {
                    // This was our active pointer going up. Choose a new
                    // active pointer and adjust accordingly.
                    final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
                    mLastTouchX = ev.getX(newPointerIndex);
                    mLastTouchY = ev.getY(newPointerIndex);
                    mActivePointerId = ev.getPointerId(newPointerIndex);
                }
                break;
            }
            }
    
            return true;
        }
    
        @Override
        public void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
            canvas.save();
            Log.d("DEBUG", "X: "+mPosX+" Y: "+mPosY);
            canvas.translate(mPosX, mPosY);
            canvas.scale(mScaleFactor, mScaleFactor);
            mImage.draw(canvas);
            canvas.restore();
        }
    
        private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
            @Override
            public boolean onScale(ScaleGestureDetector detector) {
                mScaleFactor *= detector.getScaleFactor();
    
                // Don't let the object get too small or too large.
                mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 10.0f));
    
                invalidate();
                return true;
            }
        }
    
    }
    
    0 讨论(0)
  • 2021-01-30 14:41

    You can https://github.com/siddhpuraamitr/MultitouchWithDynamicAddandRemove try this code in your project

    0 讨论(0)
提交回复
热议问题