NGUI源码分析(六) UIProgressBar和UISlider

来源:互联网 发布:免费淘宝一键复制宝贝 编辑:程序博客网 时间:2024/05/18 20:05
UISlider继承于UIProgressBar 它们是非常重要和实用的类,UIProgressBar它实现了进度条的功能,UISlider在UIProgressBar的基础上实现了拖拽
 UIProgressBar 介绍:
一.重要属性:
 
 //方向:左到右,右到左,下到上,上到下
 public enum FillDirection
 {
      LeftToRight,
      RightToLeft,
      BottomToTop,
      TopToBottom,
 }
 
protected UIWidget mBG; //背景
protected UIWidget mFG;//前景
protected float mValue = 1f;//进度百分比值
protected FillDirection mFill = FillDirection.LeftToRight;//默认左到右
 
public int numberOfSteps = 0;//步长 如果为5 意思是滑动条分为5步,每一步的百分比分别为0, 0.25, 0.5, 0.75, 1.0.
 
二.主要方法
  ForceUpdate() 核心方法 根据Value更新滑条
 
   //获得前景Sprite
   UIBasicSprite sprite = mFG as UIBasicSprite;
   if (isHorizontal)
   {
        //如果类型是填充类型
        if (sprite != null && sprite.type == UIBasicSprite.Type.Filled)
        {
             if (sprite.fillDirection == UIBasicSprite.FillDirection.Horizontal ||
             sprite.fillDirection == UIBasicSprite.FillDirection.Vertical)
         {
              sprite.fillDirection = UIBasicSprite.FillDirection.Horizontal;
              sprite.invert = isInverted;
         }
        //设置前景Sprite填充百分比
         sprite.fillAmount = value;
    }
    else
    {
        //设置前景Sprite 显示区域
         mFG.drawRegion = isInverted ?
          new Vector4(1f - value, 0f, 1f, 1f) :
          new Vector4(0f, 0f, value, 1f);
         mFG.enabled = value > 0.001f;
    }
 
UISlider介绍:
一.重要方法:
 //在OnStart中检测背景是否有碰撞组件 然后监听背景的拖拽
 protected override void OnStart ()
 {
      GameObject bg = (mBG != null && (mBG.collider != null || mBG.GetComponent<Collider2D>() != null)) ? mBG.gameObject : gameObject;
      UIEventListener bgl = UIEventListener.Get(bg);
      //监听按下
      bgl.onPress += OnPressBackground;
      //监听拖拽
      bgl.onDrag += OnDragBackground;
    
      .....
}
 
 //按下事件处理
 protected void OnPressBackground (GameObject go, bool isPressed)
 {
      if (UICamera.currentScheme == UICamera.ControlScheme.Controller) return;
      //获得当前相机
      mCam = UICamera.currentCamera;
      //通过屏幕点击位置获得进度百分比
      value = ScreenToValue(UICamera.lastTouchPosition);
       //拖拽结束回调
      if (!isPressed && onDragFinished != null) onDragFinished();
 }
 
 //通过屏幕点击位置获得进度百分比
 protected float ScreenToValue (Vector2 screenPos)
 {
      Transform trans = cachedTransform;
      //以当前Slider对象为基点 以屏幕向外为法线 创建一个平面
      Plane plane = new Plane(trans.rotation * Vector3.back, trans.position);
 
      
      float dist;
      //从屏幕点击的位置为起始 生成一条射线 
      Ray ray = cachedCamera.ScreenPointToRay(screenPos);
      
       //检测射线是否穿啊过平面
      if (!plane.Raycast(ray, out dist)) return value;
 
       
       //如果穿过平面,先用ray.GetPoint(dist)获得射线与平面的相交点 再通过InverseTransformPoint方法把相交点从世界坐标系转换为局部坐标
       //最后通过这个局部坐标获得进度百分比值
      return LocalToValue(trans.InverseTransformPoint(ray.GetPoint(dist)));
 }
 
  //通过局部坐标计算出进度百分比值
 protected virtual float LocalToValue (Vector2 localPos)
 {
      if (mFG != null)
      {
           //获得局部矩形顶点
           Vector3[] corners = mFG.localCorners;
           //用右上点-左上点计算出尺寸
           Vector3 size = (corners[2] - corners[0]);
 
       if (isHorizontal)
       {
            //(点击位置 -  左边x坐标) / 宽度
            float diff = (localPos.x - corners[0].x) / size.x;
            return isInverted ? 1f - diff : diff;
       }
       else
       {
            //(点击位置 -  左下Y坐标) / 高度
            float diff = (localPos.y - corners[0].y) / size.y;
            return isInverted ? 1f - diff : diff;
       }
  }
      return value;
 }
原文地址:http://www.cnblogs.com/rocky300/articles/4682648.html
0 0
原创粉丝点击