(转) view视图的放大、缩小、旋转

控件移动,放大,缩小,旋转

 

1,代码添加控件

例如:

 

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1.    /* 
  2.     1.创建一个控件 
  3.     2.设置控件的位置,大小 
  4.     3.设置控件所需要的各个属性 
  5.     4.添加入父控件 
  6.     5.添加监听 
  7.      
  8.     */  
  9.      
  10.      
  11.    UIButton *btn1=[[UIButton alloc] init]; // 创建一个控件  
  12. btn1.frame=CGRectMake(20, 20, 100, 100); // 设置控件的位置,大小  
  13.    [btn1 setTitle:@"123" forState:UIControlStateNormal]; // 设置控件所需要的各个属性  
  14.    [btn1 setBackgroundImage:[UIImage imageNamed:@"btn_01"] forState:UIControlStateNormal];  
  15.    [btn1 setTitle:@"456" forState:UIControlStateHighlighted];  
  16.    [btn1 setBackgroundImage:[UIImage imageNamed:@"btn_02" ] forState:UIControlStateHighlighted];  
  17.    [self.view addSubview:btn1]; // 添加入父控件  
  18. [btn1 addTarget:self action:@selector(clickMove:) forControlEvents:UIControlEventTouchUpInside]; // 添加监听  


2.控件的常见属性
所有的UI控件最终都继承自UIView:
UI控件的公共属性都定义在UIView中

 

 

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. @property(nonatomic,readonly) UIView *superview; // 获得自己的父控件对象  
  2.   
  3. @property(nonatomic,readonly,copy) NSArray *subviews; //获得自己的所有子控件对象  
  4.   
  5. @property(nonatomic) NSInteger tag; //控件的ID(标识),父控件可以通过tag来找到对应的子控件  
  6.   
  7. @property(nonatomic) CGAffineTransform transform; //控件的形变属性(可以设置旋转角度、比例缩放、平移等属性)  
  8.   
  9. @property(nonatomic) CGRect frame; // 控件所在矩形框在父控件中的位置和尺寸(以父控件的左上角为坐标原点)  
  10.   
  11. @property(nonatomic) CGRect bounds; // 控件所在矩形框的位置和尺寸(以自己左上角为坐标原点,所以bounds的x、y一般为0)  
  12.   
  13. @property(nonatomic) CGPoint center; // 控件中点的位置(以父控件的左上角为坐标原点)  

 

 

3.UIView的常见方法

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. - (void)addSubview:(UIView *)view; // 添加一个子控件view  
  2.   
  3. - (void)removeFromSuperview; // 从父控件中移除  
  4.   
  5. - (UIView *)viewWithTag:(NSInteger)tag; // 根据一个tag标识找出对应的控件(一般都是子控件)  
  6.   
  7.   
  8. // 注意:下面代码是错误的,OC语法规定:不允许直接修改对象的结构体属性的成员  
  9. self.headBtn.frame.origin.y -= 10;  


图片移动的3中方式


1. transform方式来移动图片 (最常用)

 

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. typedef enum{  
  2.     kMovingDirTop,  
  3.     kMovingDirBottom,  
  4.     KMovingDirLieft,  
  5.     kMovingDirRight,  
  6. kMovingDir;  
  7.   
  8.     // 已fram点来移动(注意图片旋转后,移动的方向)  
  9.     switch (btn.tag) {  
  10.         case kMovingDirTop:  
  11.             // 改变控件的位置  
  12.             self.headImageView.transform = CGAffineTransformTranslate(self.headImageView.transform, 0, -20);  
  13.             break;  
  14.         case kMovingDirBottom:  
  15.             self.headImageView.transform = CGAffineTransformTranslate(self.headImageView.transform, 0, 20);  
  16.             break;  
  17.         case KMovingDirLieft:  
  18.             self.headImageView.transform = CGAffineTransformTranslate(self.headImageView.transform, -20, 0);  
  19.             break;  
  20.         case kMovingDirRight:  
  21.             self.headImageView.transform = CGAffineTransformTranslate(self.headImageView.transform, 20, 0);  
  22.             break;  
  23.               
  24.         default:  
  25.             break;  
  26.     };  


2. 使用center来移动控件

 

 

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. // 以中心点来移动 (注意图片旋转后,移动的方向)  
  2. CGPoint p = self.headImageView.center;  
  3.   
  4. switch (btn.tag) {  
  5.     case kMovingDirTop:  
  6.         // 改变控件的位置  
  7.         p.y -= 20;  
  8.         break;  
  9.     case kMovingDirBottom:  
  10.         p.y += 20;  
  11.         break;  
  12.     case KMovingDirLieft:  
  13.         p.x -= 20;  
  14.         break;  
  15.     case kMovingDirRight:  
  16.         p.x += 20;  
  17.         break;  
  18.   
  19.     default:  
  20.         break;  
  21. };  
  22.   
  23. self.headImageView.center = p;  



 

3.使用frame来控制控件位置

 

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1.  // 会出现问题。(如果先旋转图片后,在点击移动图片会消失不见?????)  
  2.   
  3.      CGRect rect=self.headImageView.frame;  
  4.  switch (btn.tag) {  
  5.      case kMovingDirTop:  
  6.          // 改变控件的位置  
  7.          rect.origin.y = rect.origin.y-20;  
  8.          break;  
  9.      case kMovingDirBottom:  
  10.            rect.origin.y = rect.origin.y+20;  
  11.          break;  
  12.      case KMovingDirLieft:  
  13.            rect.origin.x = rect.origin.x-20;  
  14.         break;  
  15.      case kMovingDirRight:  
  16.           rect.origin.x = rect.origin.x+20;  
  17.          break;  
  18.   
  19.      default:  
  20.          break;  
  21. };  
  22.   
  23. elf.headImageView.frame=rect;  

 

 

 

放大,缩小,旋转控件(3种方式)

 

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. typedef enum{  
  2.     kAdd=5,  
  3.     KRemore,  
  4.     kRotateLeft,  
  5.     kRotatelRight,  
  6. }kTranform;  


 1.transform方式,放大,缩小,旋转控件 (最常用)

 

 

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. /* 会以中心点来放大,缩小,旋转控件 */  
  2. switch (btn.tag) {  
  3.     case kAdd:  
  4.         // 改变控件的大小  
  5.         self.headImageView.transform = CGAffineTransformScale(self.headImageView.transform, 1.2, 1.2);  
  6.         break;  
  7.     case KRemore:  
  8.         self.headImageView.transform = CGAffineTransformScale(self.headImageView.transform, 0.8, 0.8);  
  9.         break;  
  10.     case kRotateLeft:  
  11.         // 在OC中,所有跟角度相关的数值,都是弧度值,180° = M_PI  
  12.         // 正数表示顺时针旋转  
  13.         // 负数表示逆时针旋转  
  14.         self.headImageView.transform = CGAffineTransformRotate(self.headImageView.transform, -M_PI_4);  
  15.         break;  
  16.     case kRotatelRight:  
  17.         self.headImageView.transform = CGAffineTransformRotate(self.headImageView.transform, M_PI_4);  
  18.         break;  
  19.           
  20.     default:  
  21.         break;  
  22. };  


2.  bounds方式,放大,缩小

 

 

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. /* 会以控件顶点来放大,缩小,然后计算出frame的x,y后再移动回去。启用动画效果时,一瞬间放大,然后移动到计算出的frame的x,y位置 */  
  2.    CGRect rect = self.headImageView.bounds;  
  3.   
  4.     switch (btn.tag) {  
  5.   
  6.         case kAdd:  
  7.             rect.size.width += 20;  
  8.             rect.size.height += 20;  
  9.             break;  
  10.         case KRemore:  
  11.             rect.size.width -= 20;  
  12.             rect.size.height -= 20;  
  13.             break;  
  14.               
  15.         default:  
  16.             break;  
  17.     };  
  18.       
  19.     self.headImageView.bounds = rect;  


3.2.  frame方式,放大,缩小

 

 

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. /* 会以控件顶点来放大,缩小*/  
  2.     CGRect rect = self.headImageView.frame;  
  3.   
  4.     switch (btn.tag) {  
  5.   
  6.         case kAdd:  
  7.             rect.size.width += 20;  
  8.             rect.size.height += 20;  
  9.             break;  
  10.         case KRemore:  
  11.             rect.size.width -= 20;  
  12.             rect.size.height -= 20;  
  13.             break;  
  14.               
  15.         default:  
  16.             break;  
  17.     };  
  18.       
  19.     self.headImageView.frane = rect;  



总结:
通过以下属性可以修改控件的位置
frame.origin
center


通过以下属性可以修改控件的尺寸
frame.size
bounds.size


利用transform属性可以修改控件的位移(位置)、缩放、旋转

链接地址:http://blog.csdn.net/dwt1220/article/details/26871777

转载于:https://www.cnblogs.com/lizhitai/p/4517248.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里有一个使用TextureView放大缩小旋转的例子,并处理了闪屏问题。 ```java public class TextureViewActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener { private static final String TAG = "TextureViewActivity"; private TextureView mTextureView; private float mLastX, mLastY; private int mRotation; private boolean mIsEnlarged; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_texture_view); mTextureView = findViewById(R.id.textureView); mTextureView.setSurfaceTextureListener(this); mTextureView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mLastX = event.getX(); mLastY = event.getY(); break; case MotionEvent.ACTION_MOVE: float offsetX = event.getX() - mLastX; float offsetY = event.getY() - mLastY; if (Math.abs(offsetX) > Math.abs(offsetY)) { rotateTextureView(offsetX); } else { scaleTextureView(offsetY); } mLastX = event.getX(); mLastY = event.getY(); break; } return true; } }); } private void rotateTextureView(float offsetX) { mRotation -= offsetX / 10; if (mRotation < 0) { mRotation += 360; } else if (mRotation >= 360) { mRotation -= 360; } mTextureView.setRotation(mRotation); } private void scaleTextureView(float offsetY) { float scaleY = mTextureView.getScaleY(); scaleY += offsetY / 1000; if (scaleY < 0.1f) { scaleY = 0.1f; } else if (scaleY > 2.0f) { scaleY = 2.0f; } mTextureView.setScaleX(scaleY); mTextureView.setScaleY(scaleY); if (scaleY > 1.0f) { mIsEnlarged = true; } else { mIsEnlarged = false; } } @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { Log.d(TAG, "onSurfaceTextureAvailable"); Canvas canvas = mTextureView.lockCanvas(); if (canvas != null) { canvas.drawColor(Color.BLACK); mTextureView.unlockCanvasAndPost(canvas); } } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { Log.d(TAG, "onSurfaceTextureSizeChanged"); Canvas canvas = mTextureView.lockCanvas(); if (canvas != null) { canvas.drawColor(Color.BLACK); mTextureView.unlockCanvasAndPost(canvas); } } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { Log.d(TAG, "onSurfaceTextureDestroyed"); return true; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) { Log.d(TAG, "onSurfaceTextureUpdated"); if (!mIsEnlarged) { Canvas canvas = mTextureView.lockCanvas(); if (canvas != null) { canvas.drawColor(Color.BLACK); mTextureView.unlockCanvasAndPost(canvas); } } } } ``` 在这个例子中,我们使用`TextureView`展示视频画面,并通过手势实现了放大缩小旋转功能,同时还处理了闪屏问题。 在`onCreate()`方法中,我们首先设置了`TextureView`的`SurfaceTextureListener`和`OnTouchListener`,其中`SurfaceTextureListener`用于监听`SurfaceTexture`的创建、大小改变和销毁,而`OnTouchListener`用于监听用户手势操作。 在`onTouch()`方法中,我们根据手势的横向偏移量来旋转`TextureView`,根据手势的纵向偏移量来缩放`TextureView`。由于`TextureView`的缩放会导致视图出现闪屏,因此我们在缩小到原始大小时重新绘制`TextureView`,避免了闪屏问题。 在`onSurfaceTextureAvailable()`和`onSurfaceTextureSizeChanged()`方法中,我们在`TextureView`上绘制了一个黑色背景,以避免闪屏问题。 在`onSurfaceTextureDestroyed()`方法中,我们返回`true`,表示要销毁`SurfaceTexture`,这样就可以在`onSurfaceTextureUpdated()`方法中重新绘制`TextureView`,避免了闪屏问题。 需要注意的是,为了避免闪屏问题,我们在缩小到原始大小时重新绘制了`TextureView`,这可能会影响性能。因此,如果你需要高性能的应用程序,可以考虑使用OpenGL ES来绘制视频画面,这样可以更好地处理缩放和旋转,而且不会出现闪屏问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值