package irdc.ex07_19_1;import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;public class EX07_19_1 extends Activity
{
  private ImageView image1;
  private Bitmap bm;
  private int width=0;
  private int height=0;
  private int pointX=0;
  private int pointY=0;
  private int scale=0;
  private List<Bitmap> li=new ArrayList<Bitmap>();
  private GestureDetector detector;
  private myGestureListener gListener;
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
   
    /* 隐藏状态栏 */
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                              WindowManager.LayoutParams.FLAG_FULLSCREEN);
    /* 隐藏标题栏 */
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    /* 加载main.xml Layout */
    setContentView(R.layout.main);
    /* 取得屏幕宽高 */    
    width=this.getWindowManager().getDefaultDisplay().getWidth();
    height=this.getWindowManager().getDefaultDisplay().getHeight();
    
    /* 原始Bitmap设定(960*1440) */
    bm=BitmapFactory.decodeResource(getResources(),R.drawable.photo);
    /* 预因产生亡种尺廾的Bitmap */
   // int[][] f={{320,480},{640,960}};
    int[][] f={{480,800},{640,960}};
    for(int i=0;i<f.length;i++)
    {
      Bitmap tmp=Bitmap.createScaledBitmap(bm,f[i][0],f[i][1],true);
      li.add(tmp);
    }
    li.add(bm);
        
    /* ImageView初始化 */
    image1=(ImageView)findViewById(R.id.image1);
    image1.setImageBitmap(li.get(0));
    /* GestureDetector设定 */
    gListener = new myGestureListener();
    detector = new GestureDetector(EX07_19_1.this,gListener);
    /* 设定GestureDetector的OnDoubleTapListener */
    detector.setOnDoubleTapListener(
        new GestureDetector.OnDoubleTapListener()
    {
      /* 点击画面做放大的操作 */
      @Override
      public boolean onSingleTapConfirmed(MotionEvent e)
      {
        /* 仅允许放大两次 */
        if(scale!=2)
        {
          scale++;
          pointX+=(width/2);
          pointY+=(height/2);
          /* 重新设定显示的影像 */
          Bitmap newB=Bitmap.createBitmap(li.get(scale),pointX,
                                          pointY,width,height);
          image1.setImageBitmap(newB);
        }
        return false;
      }
      
      @Override
      public boolean onDoubleTapEvent(MotionEvent e)
      {
        return false;
      }
      /* 双击画面做缩小的操作 */
      @Override
      public boolean onDoubleTap(MotionEvent e)
      {
        /* 缩最小就是跟画面几样己 */
        if(scale!=0)
        {
          scale--;
          Bitmap b=li.get(scale);
          int tmpW=b.getWidth();
          int tmpH=b.getHeight();
          /* 计算X轴基准点缩小后的位置 */
          if(pointX-(width/2)>=0)
          {
            if(pointX-(width/2)+width<=tmpW)
            {
              pointX-=(width/2);    
            }
            else
            {
              pointX=tmpW-width;
            }
          }
          else
          {
            pointX=0;
          }
          /* 计算Y轴基准点缩小后的位置 */
          if(pointY-(height/2)>=0)
          {
            if(pointY-(height/2)+height<=tmpH)
            {
              pointY-=(height/2);    
            }
            else
            {
              System.out.println("Y2");
              pointY=tmpH-height;
            }
          }
          else
          {
            pointY=0;
          }
          /* 重新设定显示的影像 */
          Bitmap newB=Bitmap.createBitmap(b,pointX,pointY,
                                          width,height);
          image1.setImageBitmap(newB);
        }
        return false;
      }
    });
  }
  /* 当Activity的onTouchEvent()被触发时,
   * 触发GestureDetector的onTouchEvent() */
  @Override
  public boolean onTouchEvent(MotionEvent event)
  {
    if (detector.onTouchEvent(event))
    {
      return detector.onTouchEvent(event);
    }  
    else
    {
      return super.onTouchEvent(event);
    }
  }
  
  /* 告定义GestureListener */
  public class myGestureListener implements GestureDetector.OnGestureListener
  {
    /* 手指?屏幕勺拖拉时触发否method */
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2,
                            float distanceX,  float distanceY)
    {
      /* 取得目前显示的Bitmap */
      Bitmap b=li.get(scale);
      int tmpW=b.getWidth();
      int tmpH=b.getHeight();
      /* 计算X轴基准点移动后的吵置 */
      if(pointX+distanceX>=0){
        if((pointX+distanceX)>(tmpW-width))
        {  
          pointX=tmpW-width;
        }
        else
        {
          pointX+=distanceX;
        }
      }
      else
      {
        pointX=0;
      }
      /* 计算Y轴基准点移动后的吵置 */
      if(pointY+distanceY>=0)
      {  
        if((pointY+distanceY)>(tmpH-height))
        {  
          pointY=tmpH-height;
        }
        else
        {
          pointY+=distanceY;
        }
      }
      else
      {
        pointY=0;
      }
      /* ?果有移动,则更新Bitmap设定 */
      if(distanceX!=0&&distanceY!=0)
      {
        Bitmap newB=Bitmap.createBitmap(b,pointX,pointY,
                                        width,height);
        image1.setImageBitmap(newB);
      }
      return false;
    }    @Override
    public boolean onSingleTapUp(MotionEvent e)
    {
      return false;
    }
    
    @Override
    public boolean onDown(MotionEvent arg0)
    {
      return false;
    }    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2,
        float velocityX, float velocityY)
    {
      return false;
    }    @Override
    public void onLongPress(MotionEvent e)
    {
    }    @Override
    public void onShowPress(MotionEvent e)
    {
    }
  }
}<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
>
  <ImageView
    android:id="@+id/image1"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:src="@drawable/photo"
  />
</LinearLayout>
后台log显示如下:
08-20 00:59:15.010: ERROR/AndroidRuntime(684): FATAL EXCEPTION: main
08-20 00:59:15.010: ERROR/AndroidRuntime(684): java.lang.IllegalArgumentException: x + width must be <= bitmap.width()
08-20 00:59:15.010: ERROR/AndroidRuntime(684):     at android.graphics.Bitmap.createBitmap(Bitmap.java:401)
08-20 00:59:15.010: ERROR/AndroidRuntime(684):     at android.graphics.Bitmap.createBitmap(Bitmap.java:374)
08-20 00:59:15.010: ERROR/AndroidRuntime(684):     at irdc.ex07_19_1.EX07_19_1$1.onSingleTapConfirmed(EX07_19_1.java:77)
08-20 00:59:15.010: ERROR/AndroidRuntime(684):     at android.view.GestureDetector$GestureHandler.handleMessage(GestureDetector.java:271)
08-20 00:59:15.010: ERROR/AndroidRuntime(684):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-20 00:59:15.010: ERROR/AndroidRuntime(684):     at android.os.Looper.loop(Looper.java:123)
08-20 00:59:15.010: ERROR/AndroidRuntime(684):     at android.app.ActivityThread.main(ActivityThread.java:4627)
08-20 00:59:15.010: ERROR/AndroidRuntime(684):     at java.lang.reflect.Method.invokeNative(Native Method)
08-20 00:59:15.010: ERROR/AndroidRuntime(684):     at java.lang.reflect.Method.invoke(Method.java:521)
08-20 00:59:15.010: ERROR/AndroidRuntime(684):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-20 00:59:15.010: ERROR/AndroidRuntime(684):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-20 00:59:15.010: ERROR/AndroidRuntime(684):     at dalvik.system.NativeStart.main(Native Method)
08-20 00:59:15.030: WARN/ActivityManager(59):   Force finishing activity irdc.ex07_19_1/.EX07_19_1
08-20 00:59:15.541: WARN/ActivityManager(59): Activity pause timeout for HistoryRecord{44fe3ed8 irdc.ex07_19_1/.EX07_19_1}
08-20 00:59:15.861: INFO/hmg(623): mTouchX  480.0  mTouchY  800.0
08-20 00:59:15.861: INFO/hmg(623): mBezierControl1.x  NaN  mBezierControl1.y  800.0
08-20 00:59:15.861: INFO/hmg(623): mBezierControl2.x  480.0  mBezierControl2.y  NaN
08-20 00:59:15.861: INFO/hmg(623): mBezierEnd1.x  NaN  mBezierEnd1.y  NaN
08-20 00:59:15.861: INFO/hmg(623): mBezierEnd2.x  NaN  mBezierEnd2.y  NaN
08-20 00:59:16.190: INFO/hmg(623): mBezierControl2.x   480.0  mBezierControl2.y  NaN
08-20 00:59:26.609: WARN/ActivityManager(59): Activity destroy timeout for HistoryRecord{44fe3ed8 irdc.ex07_19_1/.EX07_19_1}
08-20 01:00:14.384: DEBUG/SntpClient(59): request time failed: java.net.SocketException: Address family not supported by protocol