0

I'm using this example to have pinch zoom property to my imageview. This example works perfectly when I set image as src to this imageview from xml. e.g.

  <com.zoom.TouchImageView
    android:id="@+id/imageView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:scaleType="matrix"
    android:src="@drawable/idontcare" />

but then if image is not large enough it does not cover full screen. So instead of src if i use background

 <com.zoom.TouchImageView
    android:id="@+id/imageView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:scaleType="matrix"
    android:background="@drawable/idontcare" />

it covers full screen but then pinch zoom does not work. Also instead of "matrix" if I use "fitXY" scale type pinchzoom does not work.

How do I achieve full screen image as well as pinchzoom? please help. Thanks in advance.

Nayanesh Gupte
  • 2,735
  • 25
  • 37

2 Answers2

0

TouchImageView only supports src not the background in ImageView. So what you can do is set your src with desired image and keep background in it as the bacground color of your image. something like that.

 <com.zoom.TouchImageView
    android:id="@+id/imageView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:scaleType="matrix"
    android:src="@drawable/idontcare"
    android:background="----- Background color of idontcare image--" />

try it.!

Nitin Bathija
  • 800
  • 3
  • 12
  • 24
  • 1
    Hello Nitin, I can not do that to achieve my purpose because Images are dynamic and they can have any background color. – Nayanesh Gupte Dec 21 '12 at 08:24
  • ok I can understand but than you will have to get the image height and width programmatically and than change the layout params accordingly. – Nitin Bathija Dec 21 '12 at 09:28
0

I passing the location of the image from sdcard to this activity and set to a imageview as a bitmap image ........

public class ZoomInZoomOut extends Activity implements OnTouchListener
{

    private static final String TAG = "Touch";
    @SuppressWarnings("unused")
    private static final float MIN_ZOOM = 1f,MAX_ZOOM = 1f;

    // These matrices will be used to scale points of the image
    Matrix matrix = new Matrix();
    Matrix savedMatrix = new Matrix();

    // The 3 states (events) which the user is trying to perform
    static final int NONE = 0;
    static final int DRAG = 1;
    static final int ZOOM = 2;
    int mode = NONE;

    // these PointF objects are used to record the point(s) the user is touching
    PointF start = new PointF();
    PointF mid = new PointF();
    float oldDist = 1f;
    private String loc;
    private ImageView view;
    private Bitmap bmImg;
    private ArrayList<String> array_loc;
    private Button   next;
    private int total=0;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        try{
            setContentView(R.layout.full_image);

            Intent i = getIntent();
            loc = i.getExtras().getString("loc").toString().trim();
            int position = i.getExtras().getInt("id");


            next = (Button)findViewById(R.id.next); 
            view = (ImageView) findViewById(R.id.full_image_view);

            bmImg = BitmapFactory.decodeFile(loc);
            view.setImageBitmap(bmImg);
            view.setOnTouchListener(this);
            System.out.println("..."+position);


            array_loc = new ArrayList<String>();
            String targetPath = "/mnt/sdcard/DCIM/Camera/";
            File targetDirector = new File(targetPath);
            File[] files = targetDirector.listFiles();
            for (File file : files){
                array_loc.add(file.getAbsolutePath());
                total+=1;
            }
            System.out.println(array_loc);
            System.out.println(array_loc.get(1));


            next.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub

                }
            });
        }catch (Exception e) {
            System.out.println(e);
        }
    }



    public boolean onTouch(View v, MotionEvent event)
    {
        try{
            ImageView view = (ImageView) v;
            view.setScaleType(ImageView.ScaleType.MATRIX);
            float scale;

            dumpEvent(event);
            // Handle touch events here...

            switch (event.getAction() & MotionEvent.ACTION_MASK)
            {
                case MotionEvent.ACTION_DOWN:   // first finger down only
                    savedMatrix.set(matrix);
                    start.set(event.getX(), event.getY());
                    Log.d(TAG, "mode=DRAG"); // write to LogCat
                    mode = DRAG;
                    break;

                case MotionEvent.ACTION_UP: // first finger lifted

                case MotionEvent.ACTION_POINTER_UP: // second finger lifted

                    mode = NONE;
                    Log.d(TAG, "mode=NONE");
                    break;

                case MotionEvent.ACTION_POINTER_DOWN: // first and second finger down

                    oldDist = spacing(event);
                    Log.d(TAG, "oldDist=" + oldDist);
                    if (oldDist > 5f) {
                        savedMatrix.set(matrix);
                        midPoint(mid, event);
                        mode = ZOOM;
                        Log.d(TAG, "mode=ZOOM");
                    }
                    break;

                case MotionEvent.ACTION_MOVE:

                    if (mode == DRAG)
                    {
                        matrix.set(savedMatrix);
                        matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); // create the transformation in the matrix  of points
                    }
                    else if (mode == ZOOM)
                    {
                        // pinch zooming
                        float newDist = spacing(event);
                        Log.d(TAG, "newDist=" + newDist);
                        if (newDist > 5f)
                        {
                            matrix.set(savedMatrix);
                            scale = newDist / oldDist; // setting the scaling of the
                                                        // matrix...if scale > 1 means
                                                        // zoom in...if scale < 1 means
                                                        // zoom out
                            matrix.postScale(scale, scale, mid.x, mid.y);
                        }
                    }
                    break;
            }

            view.setImageMatrix(matrix); // display the transformation on screen
        }catch (Exception e) {
            System.out.println(e);
        }
        return true; // indicate event was handled
    }

    /*
     * --------------------------------------------------------------------------
     * Method: spacing Parameters: MotionEvent Returns: float Description:
     * checks the spacing between the two fingers on touch
     * ----------------------------------------------------
     */

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

    /*
     * --------------------------------------------------------------------------
     * Method: midPoint Parameters: PointF object, MotionEvent Returns: void
     * Description: calculates the midpoint between the two fingers
     * ------------------------------------------------------------
     */

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

    /** Show an event in the LogCat view, for debugging */
    private void dumpEvent(MotionEvent event)
    {
        try{
            String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE","POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
            StringBuilder sb = new StringBuilder();
            int action = event.getAction();
            int actionCode = action & MotionEvent.ACTION_MASK;
            sb.append("event ACTION_").append(names[actionCode]);

            if (actionCode == MotionEvent.ACTION_POINTER_DOWN || actionCode == MotionEvent.ACTION_POINTER_UP)
            {
                sb.append("(pid ").append(action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
                sb.append(")");
            }

            sb.append("[");
            for (int i = 0; i < event.getPointerCount(); i++)
            {
                sb.append("#").append(i);
                sb.append("(pid ").append(event.getPointerId(i));
                sb.append(")=").append((int) event.getX(i));
                sb.append(",").append((int) event.getY(i));
                if (i + 1 < event.getPointerCount())
                    sb.append(";");
            }

            sb.append("]");
            Log.d("Touch Events ---------", sb.toString());
        } catch (Exception e) {
            System.out.println(e);
        }
    }

    @Override
    public void onBackPressed() {
        // TODO Auto-generated method stub

        Intent i = new Intent(getApplicationContext(),AndroidGridLayoutActivity.class);
        startActivity(i);
        ZoomInZoomOut.this.finish();
    }

}
O'Neil
  • 3,790
  • 4
  • 16
  • 30
GK_
  • 1,212
  • 1
  • 12
  • 26