注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

悠游自在

似水流年,悠游天地,自在我心

 
 
 

日志

 
 
 
 

mono:基于ImageView实现手势缩放与拖放  

2013-12-16 10:12:29|  分类: IT技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1 自定义GestureImgView ,继承自ImageView,缩放和拖放的原理是利用ImageView的ImageMatrix对图像进行变形操作,前提是其ScaleType为Matrix方式,
namespace WingFly.Screens
{
    class GestureImgView : ImageView
    {
        private Matrix matrix = new Matrix ();
        private Matrix savedMatrix = new Matrix ();
        int NONE = 0;
        int DRAG = 1;
        int ZOOM = 2;
        int mode = 0;
        //NONE;
        // Remember some things for zooming 
        PointF start = new PointF ();
        PointF mid = new PointF ();
        float oldDist = 1f;

        public GestureImgView (Context context)
            : base(context)
        {
        }

        public GestureImgView (Context context, IAttributeSet attrs)
            : base(context, attrs)
        {
        }

        public GestureImgView (Context context, IAttributeSet attrs, int defStyle)
            : base(context, attrs, defStyle)
        {
        }

        private float spacing (MotionEvent e)
        {
            float x = e.GetX (0) - e.GetX (1);
            float y = e.GetY (0) - e.GetY (1);
            return FloatMath.Sqrt (x * x + y * y);
        }

        private void midPoint (PointF point, MotionEvent e)
        {
            float x = e.GetX (0) + e.GetX (1);
            float y = e.GetY (0) + e.GetY (1);
            point.Set (x / 2, y / 2);
        }

        int lastX, lastY;

        public override bool OnTouchEvent (MotionEvent e)
        {
            WingFlyApp.LogDebug("类别:" + e.Action.ToString());
            if (GetScaleType () != ScaleType.Matrix)
                SetScaleType (ScaleType.Matrix);
            if (e.ActionMasked == MotionEventActions.PointerUp)
                WingFlyApp.LogDebug ("Infor", "多点操作");
            switch (e.Action&MotionEventActions.Mask) {
            case MotionEventActions.Down:
                lastX = (int)(e.RawX);
                lastY = (int)(e.RawY);

                matrix.Set (ImageMatrix);
                savedMatrix.Set (matrix);
                start.Set (e.GetX (), e.GetY ());
                mid.Set (Left + Width / 2, Top + Height / 2);
                WingFlyApp.LogDebug ("Infor", "触摸...");
                mode = DRAG;//ZOOM;//
                break;
            case MotionEventActions.Up:
                mode = NONE;
                break;
            case MotionEventActions.PointerDown:  //多点触控
                oldDist = this.spacing (e);
                //if (oldDist > 10f) 
                {
                    Log.Debug ("Infor", "oldDist" + oldDist);
                    savedMatrix.Set (matrix);
                    midPoint (mid, e);
                    mode = ZOOM;
                }
                WingFlyApp.LogDebug ("Infor", "多点触摸down...");
                break;
            case MotionEventActions.PointerUp:
                mode = NONE;
                break;
            case MotionEventActions.Move:
                    if (mode == DRAG) {         //拖放...
                        matrix.Set (savedMatrix);
                        matrix.PostTranslate (e.GetX () - start.X, e.GetY () - start.Y);
                    } else if (mode == ZOOM) {// 缩放 ...
                        float newDist = spacing (e);
                        if (newDist > 10) {
                            matrix.Set (savedMatrix);
                            float scale = newDist / oldDist;
                            matrix.PostScale (scale, scale, mid.X, mid.Y);              
                        }
                    }
                    ImageMatrix = matrix;
                    Invalidate ();
                    break;
            default:
                return base.OnTouchEvent (e);
            }
            return true;
        }
    }
}
2 在使用axml中使用自定义的GestureImgView代替原来ImageView的地方
                <WingFly.Screens.GestureImgView
                    android:id="@+id/CardImageView"
                    android:layout_width="fill_parent"
                    android:layout_height="200dip"
                    android:padding="5dip"
                    android:src="@drawable/icon"
                    android:scaleType="matrix"/>

3 在Activity中如下方式使用GestureImgView,
                imageview = FindViewById<GestureImgView> (Resource.Id.CardImageView);
                if (imageview != null) {
                    imageview.SetScaleType (ImageView.ScaleType.CenterInside);
                    var theCardBmp=BitmapFactory.DecodeFile (strCardFilePath);
                        if(theCardBmp!=null)
                            imageview.SetImageBitmap (theCardBmp);
                        else
                            imageview.SetImageResource (Resource.Drawable.icon);
}
这里需要说明的是,ImageView的ImageMatrix对图像进行变形操作的前提是其ScaleType为Matrix方式,但初始化时,希望ImageView自动将图像缩放至View的大小,所以在SetImageBitmap之前,先调用SetScaleType (ImageView.ScaleType.CenterInside)。而在OnTouchEvent 事件里,真正开始拖放/缩放操作之前,把ScaleType设置为Matrix方式。
  评论这张
 
阅读(141)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018