Flex学习笔记_06 使用行为对象和动画效果_ 放缩\调整大小效果

6.3.2 放缩效果和调整大小效果
Zoom 放缩效果 对对象进行放大或者缩小操作,是通过改变对象的水平比例scaleX 和垂直比例scaleY 来实现的。

 

Xml代码 复制代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">  
  3.     <mx:Style source="style.css" />  
  4.     <mx:Script>  
  5.         <![CDATA[  
  6.             import mx.effects.Zoom;  
  7.              
  8.             internal function zoomCanvas():void{  
  9.                 var newZoom:Zoom = new Zoom();  
  10.                 newZoom.zoomHeightFrom =0.01;  
  11.                 newZoom.zoomWidthFrom = 0.01;  
  12.                 newZoom.originX = 0;  
  13.                 newZoom.originY = 0;  
  14.                 newZoom.target = Canvas_1;  
  15.                 newZoom.duration = 2000;  
  16.                 newZoom.play();  
  17.             }  
  18.         ]]>  
  19.     </mx:Script>  
  20.       
  21.     <mx:Canvas id="Canvas_1" styleName="box" x="48" y="40" width="200" height="200" >  
  22.         <mx:Text x="15" y="37" text="文本,请注意放大过程中文本的变化" width="166" height="82"/>  
  23.     </mx:Canvas>  
  24.     <mx:Button x="48" y="277" label="放大" click="zoomCanvas()"/>  
  25. </mx:Application>  
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Style source="style.css" />
    <mx:Script>
        <![CDATA[
            import mx.effects.Zoom;
           
            internal function zoomCanvas():void{
                var newZoom:Zoom = new Zoom();
                newZoom.zoomHeightFrom =0.01;
                newZoom.zoomWidthFrom = 0.01;
                newZoom.originX = 0;
                newZoom.originY = 0;
                newZoom.target = Canvas_1;
                newZoom.duration = 2000;
                newZoom.play();
            }
        ]]>
    </mx:Script>
   
    <mx:Canvas id="Canvas_1" styleName="box" x="48" y="40" width="200" height="200" >
        <mx:Text x="15" y="37" text="文本,请注意放大过程中文本的变化" width="166" height="82"/>
    </mx:Canvas>
    <mx:Button x="48" y="277" label="放大" click="zoomCanvas()"/>
</mx:Application>

 

始末位置的长宽比例 :zoomWidthFrom、zoomWidthTo、zoomHeightFrom、zoomHeightTo 。取0-1的值。默认1
动画的参照点坐标:originX 、originY。 默认以组件的中心点。
captureRollEvents:是否忽略动画过程中的鼠标移上和移出动作。

Resize 调整大小 效果和 Zoom 相比,似乎相同,其实两者区别很大。Resize 是重新确定对象的长宽属性。会影响子元素。

始末位置的长宽:widthFrom、widthTo、heightFrom、heightTo
长宽的增量: widthBy、heightBy
如果指定了widthTo 则会忽略widthBy。没有指定widthBy,则默认为当前的宽度。

hideChildreTargets:针对Panel组件,用来隐藏Panel组件的子级元素,同时临时关闭Panel组件的自动调整功能,直到动画结束后再重新恢复。这样可以提搞性能。

 

Xml代码 复制代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">  
  3.     <mx:Style source="style.css" />  
  4.     <mx:Script>  
  5.         <![CDATA[  
  6.             import mx.effects.Resize;  
  7.             import mx.events.TweenEvent;  
  8.             //鼠标动作  
  9.             internal function resizeCanvas():void{  
  10.                 //创建新的Resize对象  
  11.                 var newResize:Resize = new Resize();  
  12.                 //设定高度和宽度的起始值  
  13.                 newResize.heightFrom = 200;  
  14.                 newResize.widthFrom = 200;  
  15.                 //高度的最终值  
  16.                 newResize.heightTo = 240;  
  17.                 //宽度增加40相当于 widthTo = 240  
  18.                 newResize.widthBy = 40;  
  19.                 //指定要隐藏内部元素的Panel  
  20.                 newResize.hideChildrenTargets = [Panel_1,Panel_2];  
  21.                 newResize.target = Canvas_1;  
  22.                 newResize.duration = 2000;     
  23.                 //监听动画的结束事件             
  24.                 newResize.addEventListener(TweenEvent.TWEEN_END,EndHandler);                 
  25.                 Canvas_1.autoLayout = false;  //注释掉这一句代码然后运行程序,观察差别  
  26.                 newResize.play();  
  27.             }  
  28.             internal function EndHandler(evt:TweenEvent):void{  
  29.                 Canvas_1.autoLayout = true;  
  30.             }  
  31.         ]]>  
  32.     </mx:Script>  
  33.       
  34.     <mx:Canvas id="Canvas_1" styleName="box" x="26" y="40" width="200" height="200" >  
  35.         <mx:Text x="10" y="10" text="说明:调整大小效果" width="166" height="26"/>  
  36.         <mx:Panel id="Panel_1" styleName="imgPanel" x="10" y="33" width="80%" height="80%" layout="absolute" title="面板一">  
  37.             <mx:Image x="0" y="0" source="tree.jpg"/>  
  38.         </mx:Panel>  
  39.     </mx:Canvas>  
  40.     <mx:Button x="26" y="293" label="放大" click="resizeCanvas()"/>  
  41.     <mx:Panel id="Panel_2" styleName="imgPanel" x="279" y="40" width="134" height="129" layout="absolute" title="面板二">  
  42.         <mx:Image x="0" y="0" source="tree.jpg"/>  
  43.     </mx:Panel>  
  44. </mx:Application>  
在 MFC 对话框中,可以通过 CStatic 控件来显示图片,并通过鼠标事件处理函数来实现图片的平移和放缩。下面是实现方法的大致步骤: 1. 在对话框类的头文件中添加成员变量,用于保存图片的句柄和位置信息: ``` HBITMAP m_hBitmap; // 图片句柄 CPoint m_ptOrigin; // 原点坐标 CSize m_sizeBitmap; // 图片大小 double m_fScale; // 放缩比例 ``` 2. 在 OnInitDialog 函数中,使用 LoadImage 函数加载图片,并获取图片的大小信息: ``` m_hBitmap = (HBITMAP)LoadImage(NULL, L"image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); BITMAP bm; GetObject(m_hBitmap, sizeof(BITMAP), &bm); m_sizeBitmap.cx = bm.bmWidth; m_sizeBitmap.cy = bm.bmHeight; m_ptOrigin = CPoint(m_sizeBitmap.cx / 2, m_sizeBitmap.cy / 2); m_fScale = 1.0; ``` 3. 在 OnPaint 函数中,使用 CDC 类的函数将图片绘制到控件上: ``` CPaintDC dc(this); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = dcMem.SelectObject(CBitmap::FromHandle(m_hBitmap)); dc.StretchBlt(0, 0, (int)(m_sizeBitmap.cx * m_fScale), (int)(m_sizeBitmap.cy * m_fScale), &dcMem, 0, 0, m_sizeBitmap.cx, m_sizeBitmap.cy, SRCCOPY); dcMem.SelectObject(pOldBitmap); ``` 4. 在 OnLButtonDown 函数中,记录鼠标按下时的位置: ``` SetCapture(); m_ptOrigin = point; ``` 5. 在 OnMouseMove 函数中,计算鼠标移动的距离,并根据距离调整图片的位置: ``` if (GetCapture() == this) { CPoint ptOffset = point - m_ptOrigin; m_ptOrigin = point; Invalidate(); } ``` 6. 在 OnLButtonUp 函数中,释放鼠标捕获: ``` ReleaseCapture(); ``` 7. 在 OnMouseWheel 函数中,根据滚轮的方向调整图片的大小,并根据放缩中心点的位置调整图片的位置: ``` ScreenToClient(&point); double fScale = (double)(wParam > 0 ? 1.1 : 0.9); m_fScale *= fScale; m_ptOrigin.x = (int)(point.x - fScale * (point.x - m_ptOrigin.x)); m_ptOrigin.y = (int)(point.y - fScale * (point.y - m_ptOrigin.y)); Invalidate(); ``` 需要注意的是,为了避免图片超出控件范围,需要对图片的位置进行一些限制。另外,放缩时需要将鼠标坐标转换成相对于控件的坐标,并且调整图片的大小和位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值