最近作图片的显示,遇到了些问题,简单总结
1)可以用ImageSwicher和ImageView结合在来做,这样会用到setFectory(),华而不实
最要命的是如果图片的大小超过屏幕,实现比较困难,目前是没有找到方法
2)最简单的方法是用ImageView,图片直接FIT_CENTER,android会根据图片的大小自动调节
保持图片的比例。如果图片分辨率超过屏幕,android也会自动的调整到屏幕能放下整张的图片
在放大图片的时候,可以用ImageView的SetFrame() 和setScale()方法,可以把图片放大
到超过屏幕,原理就是ImageView放大,图片跟着放大。同时也是可以添加各种animation.
大致如下:
import android.app.Activity;  
import android.content.Context;  
import android.graphics.*;  
import android.graphics.drawable.BitmapDrawable;  
import android.os.Bundle;  
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;  
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageView;  
import android.widget.ImageView.ScaleType;  
import android.widget.LinearLayout;
    //创建一个自己的ImageView类  
    class MyImageView extends ImageView {  
        private float scale = 0.1f;  
      //两点触屏后之间的长度  
        private float beforeLenght;  
        private float afterLenght;  
        //单点移动的前后坐标值  
        private float afterX,afterY;  
        private float beforeX,beforeY;  
        public MyImageView(Context context) {  
            super(context);  
        }  
        public MyImageView(Context context, AttributeSet attrs) {  
        this(context, attrs, 0);
        } 
        public MyImageView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
        //用来设置ImageView的位置  
        private void setLocation(int x,int y) {  
            this.setFrame(this.getLeft()+x, this.getTop()+y, this.getRight()+x, this.getBottom()+y);  
        }  
          
        /* 
         * 用来放大缩小ImageView 
         * 因为图片是填充ImageView的,所以也就有放大缩小图片的效果 
         * flag为0是放大图片,为1是小于图片 
         */  
        public void setScale(float temp,int flag) {  
            if(flag==0) {  
                this.setFrame(this.getLeft()-(int)(temp*this.getWidth()),   
                              this.getTop()-(int)(temp*this.getHeight()),   
                              this.getRight()+(int)(temp*this.getWidth()),   
                              this.getBottom()+(int)(temp*this.getHeight()));     
            }else {  
                this.setFrame(this.getLeft()+(int)(temp*this.getWidth()),   
                              this.getTop()+(int)(temp*this.getHeight()),   
                              this.getRight()-(int)(temp*this.getWidth()),   
                              this.getBottom()-(int)(temp*this.getHeight()));  
            }  
        }  
        //绘制边框        
         @Override  
          protected void onDraw(Canvas canvas) {  
              super.onDraw(canvas);      
              Rect rec=canvas.getClipBounds();  
              rec.left++;
              rec.top++;
              rec.bottom--;  
              rec.right--;  
              Paint paint=new Paint();  
              paint.setColor(Color.RED);  
              paint.setStyle(Paint.Style.STROKE);  
              canvas.drawRect(rec, paint);  
          }  
           
        /* 让图片跟随手指触屏的位置移动 
         * beforeX、Y是用来保存前一位置的坐标 
         * afterX、Y是用来保存当前位置的坐标 
         * 它们的差值就是ImageView各坐标的增加或减少值 
         */  
        public void moveWithFinger(MotionEvent event) {  
            switch(event.getAction()) {  
            case MotionEvent.ACTION_DOWN:  
            //Log.d(TAG, "down ..");
                beforeX = event.getX();  
                beforeY = event.getY();  
                break;  
            case MotionEvent.ACTION_MOVE:  
            //Log.d(TAG, "move ..");
                afterX = event.getX();  
                afterY = event.getY();  
                this.setLocation((int)(afterX-beforeX),(int)(afterY-beforeY));  
                beforeX = afterX;  
                beforeY = afterY;  
                break;  
            case MotionEvent.ACTION_UP:  
            //Log.d(TAG, "up ..");
                break;  
            }  
        }  
        /* 
         * 通过多点触屏放大或缩小图像 
         * beforeLenght用来保存前一时间两点之间的距离 
         * afterLenght用来保存当前时间两点之间的距离 
         */  
        public void scaleWithFinger(MotionEvent event) {  
            float moveX = event.getX(1) - event.getX(0);  
            float moveY = event.getY(1) - event.getY(0);  
            switch(event.getAction()) {  
            case MotionEvent.ACTION_DOWN:  
                beforeLenght = (float) Math.sqrt( (moveX*moveX) + (moveY*moveY) );  
                break;  
            case MotionEvent.ACTION_MOVE:  
                //得到两个点之间的长度  
                afterLenght = (float) Math.sqrt( (moveX*moveX) + (moveY*moveY) );  
                float gapLenght = afterLenght - beforeLenght;  
                if(gapLenght == 0) {  
                    break;  
                }  
                //如果当前时间两点距离大于前一时间两点距离,则传0,否则传1  
                if(gapLenght>0) {  
                    this.setScale(scale,0);  
                }else {  
                    this.setScale(scale,1);  
                }  
                beforeLenght = afterLenght;  
                break;  
            }  
        }  
   //这里来监听屏幕触控时间  
   @Override  
    public boolean onTouchEvent(MotionEvent event) {  
       /* 
        * 判定用户是否触摸到了图片 
        * 如果是单点触摸则调用控制图片移动的方法 
        * 如果是2点触控则调用控制图片大小的方法 
        */  
        if(event.getY() > this.getTop() && event.getY() < this.getBottom()  
                && event.getX() > this.getLeft() && event.getX() < this.getRight()) {  
            if(event.getPointerCount() == 2) {  
            this.scaleWithFinger(event);  
            }else if(event.getPointerCount() == 1) {  
            this.moveWithFinger(event);  
            }             
        }  
        return true;  
    }         
}