2011-11-10 129 views
1

我使用http://android.jmsliu.com/138/android-infinite-loop-gallery.html给出的代码创建了一个覆盖流。 enter image description here如何使用缩放缩放封面流图像放大android

它工作正常。现在我的问题是,我将如何实现图像缩放。

我已经使用TouchImageView类而不是ImagView。但它不起作用。

下面给出的是TouchImageView.java

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Matrix; 
import android.graphics.PointF; 
import android.view.MotionEvent; 
import android.view.ScaleGestureDetector; 
import android.view.View; 
import android.widget.ImageView; 

    public class TouchImageView extends ImageView { 

Matrix matrix = new Matrix(); 

// We can be in one of these 3 states 
static final int NONE = 0; 
static final int DRAG = 1; 
static final int ZOOM = 2; 
int mode = NONE; 

// Remember some things for zooming 
PointF last = new PointF(); 
PointF start = new PointF(); 
float minScale = 1f; 
float maxScale = 3f; 
float[] m; 

float redundantXSpace, redundantYSpace; 

float width, height; 
static final int CLICK = 3; 
float saveScale = 1f; 
float right, bottom, origWidth, origHeight, bmWidth, bmHeight; 

ScaleGestureDetector mScaleDetector; 

Context context; 


public TouchImageView(Context context) { 
    super(context); 
    super.setClickable(true); 
    this.context = context; 
    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); 
    matrix.setTranslate(1f, 1f); 
    m = new float[9]; 
    setImageMatrix(matrix); 
    setScaleType(ScaleType.MATRIX); 

    setOnTouchListener(new OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      mScaleDetector.onTouchEvent(event); 

      matrix.getValues(m); 
      float x = m[Matrix.MTRANS_X]; 
      float y = m[Matrix.MTRANS_Y]; 
      PointF curr = new PointF(event.getX(), event.getY()); 

      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        last.set(event.getX(), event.getY()); 
        start.set(last); 
        mode = DRAG; 
        break; 
       case MotionEvent.ACTION_MOVE: 
        if (mode == DRAG) { 
         float deltaX = curr.x - last.x; 
         float deltaY = curr.y - last.y; 
         float scaleWidth = Math.round(origWidth * saveScale); 
         float scaleHeight = Math.round(origHeight * saveScale); 
         if (scaleWidth < width) { 
          deltaX = 0; 
          if (y + deltaY > 0) 
           deltaY = -y; 
          else if (y + deltaY < -bottom) 
           deltaY = -(y + bottom); 
         } else if (scaleHeight < height) { 
          deltaY = 0; 
          if (x + deltaX > 0) 
           deltaX = -x; 
          else if (x + deltaX < -right) 
           deltaX = -(x + right); 
         } else { 
          if (x + deltaX > 0) 
           deltaX = -x; 
          else if (x + deltaX < -right) 
           deltaX = -(x + right); 

          if (y + deltaY > 0) 
           deltaY = -y; 
          else if (y + deltaY < -bottom) 
           deltaY = -(y + bottom); 
         } 
         matrix.postTranslate(deltaX, deltaY); 
         last.set(curr.x, curr.y); 
        } 
        break; 

       case MotionEvent.ACTION_UP: 
        mode = NONE; 
        int xDiff = (int) Math.abs(curr.x - start.x); 
        int yDiff = (int) Math.abs(curr.y - start.y); 
        if (xDiff < CLICK && yDiff < CLICK) 
         performClick(); 
        break; 

       case MotionEvent.ACTION_POINTER_UP: 
        mode = NONE; 
        break; 
      } 
      setImageMatrix(matrix); 
      invalidate(); 
      return true; // indicate event was handled 
     } 

    }); 
} 

@Override 
public void setImageBitmap(Bitmap bm) { 
    super.setImageBitmap(bm); 
    bmWidth = bm.getWidth(); 
    bmHeight = bm.getHeight(); 
} 

public void setMaxZoom(float x) 
{ 
    maxScale = x; 
} 

private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 
    @Override 
    public boolean onScaleBegin(ScaleGestureDetector detector) { 
     mode = ZOOM; 
     return true; 
    } 

    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
     float mScaleFactor = (float)Math.min(Math.max(.95f, detector.getScaleFactor()), 1.05); 
     float origScale = saveScale; 
     saveScale *= mScaleFactor; 
     if (saveScale > maxScale) { 
      saveScale = maxScale; 
      mScaleFactor = maxScale/origScale; 
     } else if (saveScale < minScale) { 
      saveScale = minScale; 
      mScaleFactor = minScale/origScale; 
     } 
     right = width * saveScale - width - (2 * redundantXSpace * saveScale); 
     bottom = height * saveScale - height - (2 * redundantYSpace * saveScale); 
     if (origWidth * saveScale <= width || origHeight * saveScale <= height) { 
      matrix.postScale(mScaleFactor, mScaleFactor, width/2, height/2); 
      if (mScaleFactor < 1) { 
       matrix.getValues(m); 
       float x = m[Matrix.MTRANS_X]; 
       float y = m[Matrix.MTRANS_Y]; 
       if (mScaleFactor < 1) { 
        if (Math.round(origWidth * saveScale) < width) { 
         if (y < -bottom) 
          matrix.postTranslate(0, -(y + bottom)); 
         else if (y > 0) 
          matrix.postTranslate(0, -y); 
        } else { 
         if (x < -right) 
          matrix.postTranslate(-(x + right), 0); 
         else if (x > 0) 
          matrix.postTranslate(-x, 0); 
        } 
       } 
      } 
     } else { 
      matrix.postScale(mScaleFactor, mScaleFactor, detector.getFocusX(), detector.getFocusY()); 
      matrix.getValues(m); 
      float x = m[Matrix.MTRANS_X]; 
      float y = m[Matrix.MTRANS_Y]; 
      if (mScaleFactor < 1) { 
       if (x < -right) 
        matrix.postTranslate(-(x + right), 0); 
       else if (x > 0) 
        matrix.postTranslate(-x, 0); 
       if (y < -bottom) 
        matrix.postTranslate(0, -(y + bottom)); 
       else if (y > 0) 
        matrix.postTranslate(0, -y); 
      } 
     } 
     return true; 

    } 
} 

@Override 
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) 
{ 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    width = MeasureSpec.getSize(widthMeasureSpec); 
    height = MeasureSpec.getSize(heightMeasureSpec); 
    //Fit to screen. 
    float scale; 
    float scaleX = (float)width/(float)bmWidth; 
    float scaleY = (float)height/(float)bmHeight; 
    scale = Math.min(scaleX, scaleY); 
    matrix.setScale(scale, scale); 
    setImageMatrix(matrix); 
    saveScale = 1f; 

    // Center the image 
    redundantYSpace = (float)height - (scale * (float)bmHeight) ; 
    redundantXSpace = (float)width - (scale * (float)bmWidth); 
    redundantYSpace /= (float)2; 
    redundantXSpace /= (float)2; 

    matrix.postTranslate(redundantXSpace, redundantYSpace); 

    origWidth = width - 2 * redundantXSpace; 
    origHeight = height - 2 * redundantYSpace; 
    right = width * saveScale - width - (2 * redundantXSpace * saveScale); 
    bottom = height * saveScale - height - (2 * redundantYSpace * saveScale); 
    setImageMatrix(matrix); 
} 
} 

任何人可以帮助我理清这个问题..

在此先感谢

我在这里将我的类文件。

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.view.ViewGroup; 
import android.view.View.OnLongClickListener; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemLongClickListener; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.Toast; 




public class InfiniteGalleryActivity extends Activity { 

public static int pos; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 

      InfiniteGallery gallery = (InfiniteGallery) findViewById(R.id.mygallery); 
      gallery.setAdapter(new ImageAdapter(this)); 

      gallery.setOnTouchListener(new OnTouchListener() { 


       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        switch (event.getAction() & MotionEvent.ACTION_MASK) { 

        case MotionEvent.ACTION_POINTER_DOWN: 

         Intent intent = new Intent(InfiniteGalleryActivity.this, TouchImageViewActivity.class); 
          intent.putExtra("postion", pos); 
          startActivity(intent); 
         } 
        return false; 
       } 


      }); 

    } 
    public class ImageAdapter extends BaseAdapter { 
      private LayoutInflater inflater = null; 

      private final Integer[] imageDataList = { R.drawable.a, R.drawable.b, 
          R.drawable.c}; 

      public ImageAdapter(Context c) { 
        inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      } 

      public int getCount() { 
        if (imageDataList != null) { 
          return imageDataList.length; 
        } else { 
          return 0; 
        } 
      } 

      public Object getItem(int position) { 
        return position; 
      } 

      public long getItemId(int position) { 
        return position; 
      } 

      public View getView(int position, View convertView, ViewGroup parent) { 
        View view = convertView; 
        pos =position; 
        if (view == null) { 
          view = inflater.inflate(R.layout.itemrender, parent, false); 
        } 

        ((ImageView) view).setImageResource(imageDataList[position]); 
        return view; 
      } 
    } 
    } 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.LinearLayout; 

public class TouchImageViewActivity extends Activity { 
Bitmap imageToBeZoom = null; 

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

    try { 
     int postion = getIntent().getExtras().getInt("position"); 

        // Here you must add the resource id for image potion. 
        int resourse_id = postion;// get the resouce id here e.g arr[postion]; 
     BitmapFactory.decodeResource(getResources(), resourse_id); 
     imageToBeZoom = BitmapFactory.decodeFile(imagePath); 

     ZoomableImageView zoom = new ZoomableImageView(TouchImageViewActivity.this); 
     zoom.setBitmap(imageToBeZoom); 
     zoom.setHandler(handler); 

     LayoutParams parms = new LayoutParams(new LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, 
       LinearLayout.LayoutParams.FILL_PARENT)); 
     LinearLayout layou = new LinearLayout(TouchImageViewActivity.this); 
     layou.setBackgroundResource(R.color.black); 
     layou.addView(zoom, parms); 
     setContentView(layou); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
protected void onDestroy() { 
    if (imageToBeZoom != null && imageToBeZoom.isRecycled() == false) { 
     imageToBeZoom.recycle(); 
    } 
    super.onDestroy(); 
} 
} 

现在我需要在画廊以幻灯片图像和缩放当前图像是存在在视图中。

+0

棘手,做这个用的画廊。由于厨房使用触摸事件进行动画。所以触摸事件不被图像使用。我所做的是在画廊中使用简单的ImageView。但是,当用户Mutitouch画廊,然后显示用户“TouchView”,用户可以进行缩放。 – Arslan

+0

嗨阿尔斯兰..谢谢你的回复..你可以请你把你的代码和我一起...这对我的项目会很有帮助。 – Kris

+0

也可以在webview中嵌入所有图像,然后在webview组件中使用隐式定义的缩放功能。这可能是一个替代解决方案 – 2011-11-10 11:11:39

回答

1
​​
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.LinearLayout; 

public class TouchImageViewActivity extends Activity { 
Bitmap imageToBeZoom = null; 

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

    try { 
     int rid = getIntent().getExtras().getInt("resource_id"); 

     BitmapFactory.decodeResource(getResources(), rid); 
     imageToBeZoom = BitmapFactory.decodeFile(imagePath); 

     ZoomableImageView zoom = new ZoomableImageView(TouchImageViewActivity.this); 
     zoom.setBitmap(imageToBeZoom); 

     LayoutParams parms = new LayoutParams(new LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, 
       LinearLayout.LayoutParams.FILL_PARENT)); 
     LinearLayout layou = new LinearLayout(TouchImageViewActivity.this); 
     layou.setBackgroundResource(android.R.color.black); 
     layou.addView(zoom, parms); 
     setContentView(layou); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
protected void onDestroy() { 
    if (imageToBeZoom != null && imageToBeZoom.isRecycled() == false) { 
     imageToBeZoom.recycle(); 
    } 
    super.onDestroy(); 
} 
} 
+0

请在这里问你缺少。我没有项目可以分享。感谢 – Arslan

+0

可以请您提供ZoomableImageView类文件.. – Kris

+0

https://github.com/a85/WebComicViewer/blob/master/src/com/rickreation/ui/ZoomableImageView.java – Arslan