ArcMenu如何去修改类似小米的系统菜单

在源码中,这段是申请空间大小的,为那些子控件,不然你出现就没有地方显示了.
@Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  final int radius = mRadius = mSetRadius == -1 ? computeRadius(
    Math.abs(mToDegrees - mFromDegrees), getChildCount(),
    mChildSize, mChildPadding, MIN_RADIUS) : mSetRadius;
  final int size = radius * 2 + mChildSize + mChildPadding
    + mLayoutPadding * 2;
  setMeasuredDimension(size, size);
  final int count = getChildCount();
  for (int i = 0; i < count; i++) {
   getChildAt(i)
     .measure(
       MeasureSpec.makeMeasureSpec(mChildSize,
         MeasureSpec.EXACTLY),
       MeasureSpec.makeMeasureSpec(mChildSize,
         MeasureSpec.EXACTLY));
  }
 }
这段代码是当动画后,requestlayout 就触发这个,让子控件显示在真正的位置上.
原来这里 getheight()/2的,我改成了 gethe... ,是为了将控件放在最下面,才能形成
从最下面出来的效果.
@Override
 protected void onLayout(boolean changed, int l, int t, int r, int b) {
  final int centerX = getWidth() / 2;
  final int centerY = getHeight();
  final int radius = mExpanded ? mRadius : 0; // 如果半径为0,回到了中心点.
  final int childCount = getChildCount();
  final float perDegrees = (mToDegrees - mFromDegrees) / (childCount - 1);
  float degrees = mFromDegrees; // 角度.
  for (int i = 0; i < childCount; i++) {
   Rect frame = computeChildFrame(centerX, centerY, radius, degrees,
     mChildSize);
   degrees += perDegrees;
   getChildAt(i).layout(frame.left, frame.top, frame.right,
     frame.bottom);
  }
 }
 @SuppressLint("NewApi")
 private void bindChildAnimation(final View child, final int index,
   final long duration) {
  /**
   * true : 回来. false : 出去.
   */
  final boolean expanded = mExpanded; // 弹出,弹进的动画旋转.
  final int centerX = getWidth() / 2;
  final int centerY = getHeight();
  final int radius = expanded ? 0 : mRadius;
  final int childCount = getChildCount();
  // (360 - 180) / (5 - 1) = 45 度 !! 如果这里是5个的话,还是可以到达中心点的,如果6,7,这里需要改为45.
  final float perDegrees = (mToDegrees - mFromDegrees) / (childCount - 1);
  Rect frame;
  if (!expanded) {
   frame = computeChildFrame(centerX, centerY, radius, mFromDegrees
     + index * perDegrees, mChildSize); // 计算需要移动过去的位置.
  } else {
   frame = computeChildFrame(centerX, centerY, mRadius, mFromDegrees
     + (270 - mFromDegrees), mChildSize); // 计算需要移动过去的位置.
  }
  //
  Rect framedown = computeChildFrame(centerX, centerY, 0, mFromDegrees
    + (270 - mFromDegrees), mChildSize); // 计算需要移动过去的位置.
  //
  final int toXDelta = frame.left - child.getLeft(); // 用准备移动的left -
               // 控件原始的left.
  final int toYDelta = frame.top - child.getTop(); //
  Interpolator interpolator = mExpanded ? new AccelerateInterpolator()
    : new OvershootInterpolator(1.5f); // 加速器.
  final long startOffset = computeStartOffset(childCount, mExpanded,
    index, 0.1f, duration, interpolator); //
    // 旋转动画. createShrinkAnimation 缩回去的动画,反之.
  Animation animation = mExpanded ? createShrinkAnimation(0, toXDelta, 0,
    toYDelta, startOffset, duration + 300, interpolator, framedown)
    : createExpandAnimation(0, toXDelta, 0, toYDelta, startOffset,
      duration, interpolator); // 动画效果.
  if (mExpanded) {
   this.cb.onSwitchGone();
  } else {
   this.cb.onSwitchVisible();
  }
  final boolean isLast = getTransformedIndex(expanded, childCount, index) == childCount - 1;
  animation.setAnimationListener(new AnimationListener() {
   @Override
   public void onAnimationStart(Animation animation) {
   }
   @Override
   public void onAnimationRepeat(Animation animation) {
   }
   @Override
   public void onAnimationEnd(Animation animation) {
    if (isLast) {
     postDelayed(new Runnable() {
      @Override
      public void run() {
       onAllAnimationsEnd();
      }
     }, 0);
    }
   }
  });
  child.setAnimation(animation); // 设置动画.
 }

然后再修改角度. 当外部的 toDegrees, mFromDegrees 进行加减的时候,就开始旋转了.

 public void setArc(float fromDegrees, float toDegrees,
   ArcMenuDegreesCallBack cb) {
  if (mFromDegrees == fromDegrees && mToDegrees == toDegrees) {
   return;
  }
  mFromDegrees = fromDegrees;
  mToDegrees = toDegrees;
  requestLayout(); //
  if (cb != null)
   cb.onLastDegrees();
 }
时间: 2024-08-24 23:54:46

ArcMenu如何去修改类似小米的系统菜单的相关文章

[CrunchBang]修改win+ubuntu 双 系统菜单的 启动顺序 引导

说到启动就不得不说GRUB,Linux下大名鼎鼎的启动管理工具(曾经的LILO已经风光不再),当然现在已经是GRUB2了,GRUB2和GRUB最重要的区别就是,GRUB存放系统启动信息的文件为/boot/grub/menu.lst,而GRUB2则为/boot/grub/grub.cfg.由于ubuntu10.10采用的是GRUB2,所以这里主要讲GRUB2. 终端输入gedit /boot/grub/grub.cfg,打开这个文件,开头几行注释如下: # # DO NOT EDIT THIS F

在装完Linux系统之后自己去修改Swap分区的大小(两种方法)

在装完Linux系统之后自己去修改Swap分区的大小(两种方法) 在安装完Linux系统后,swap分区太小怎么办,怎么可以扩大Swap分区呢?有两个办法,一个是从新建立swap分区,一个是增加swap分区.下面介绍这两种方法: 第一您必须有root权限,过程中一定要很小心,一不小心就破坏了整个硬盘的数据,执行下面的过程之前您需要三思而行,错误操作后的后果由执行者自己承担. 新建swap分区 1.以root身份进入控制台,输入 # swapoff -a          #停止交换分区 2. 用

Linux修改类似.bash_profile等配置文件,不重启系统让配置立即生效的做法

Linux修改类似.bash_profile等配置文件,不重启系统让配置立即生效的做法: A . .bash_profile B source .bash_profile C exec bash --login

小米3系统计算器自定义开关控件-MySwitchView

1.前言 在android4.0以后,有switch控件,类似于iPhone上面滑块的效果,但是只能用在4.0以后的系统中,之前的平台,就无法使用这种控件.近段时间,看到了小米3手机上自带的计算器app,有这样的效果,上面的一个控件,觉得很漂亮,并且与iPhone上的效果略有不同,于是自己动手编写了一下这个功能,在编写的过程中,参考过网上的一些demo,运行后,在控件滑动的时候,感觉动画不平滑,有卡顿的现象,反复修改,最后还是有一些问题,感觉是在滑动中的状态,没有合理的控制好.无奈只能参考Goo

如何去修改一段陌生的代码

写在这里仅仅是为了备忘 场景: 最近的工作中用到使用ffmpeg实现了一些功能,现在有需求的变更,需要修改(重新组合或者拆分)这些功能. 本人对ffmpeg十分陌生,对我们项目中ffmpeg实现的功能比较熟悉.这是典型的对业务熟,对代码不熟,呵呵. 1.熟悉功能 2.不熟悉实现功能的代码 3.要去修改这些功能(代码) 通过这几天的工作努力完成这项工作.特总结如下: 1.理解功能,对功能根据代码的结构进行细化,比如保存文件细化为 编码 + 保存文件 (功能的细化是根据代码的实现逻辑来的,并不是凭空

很多时候运行tomcat 的时候总是会提示tomcat 的端口被占用 但是任务管理器里面还找不到是哪个端口被占用了 因此很多人就重新配置tomcat 或者去修改tomcat的端口号 ,其实这么做太麻烦了 ,小弟在这里告诉你一个非常简单的方法。 1.在开始菜单中选择运行 然后输入cmd 进入DOS界面。显示如下: 2.在Dos窗口中输入netstat -ano|findst

很多时候运行tomcat 的时候总是会提示tomcat 的端口被占用 但是任务管理器里面还找不到是哪个端口被占用了 因此很多人就重新配置tomcat  或者去修改tomcat的端口号 ,其实这么做太麻烦了 ,小弟在这里告诉你一个非常简单的方法. 1.在开始菜单中选择运行  然后输入cmd  进入DOS界面.显示如下: 2.在Dos窗口中输入netstat   -ano|findstr  8080(注意的 我的Tomcat 的断口号 是8080 你的断口号是多少就写多少) 输入完成后回车 会弹出下

android 命令修改时间或程序修改系统时间

前提是手机必须先获取root; root方法见其他章节或网上都有介绍 adb shell  进入shell 终端界面 1.先设置系统的时区配置 cat /data/property/persist.sys.timezone //查看当前时区配置文件 setprop persist.sys.timezone GMT        //修改属性 2.开始设置修改当前系统时间 date -s "yyyymmdd.[[[hh]mm]ss]"  或System/bin/date -s "

快递发单抢单软件开发类似滴滴打车抢单系统

快递发单抢单软件开发类似滴滴打车抢单系统(微or电158.1500.1390小凡团队)快递抢单软件开发,快递抢单系统开发,快递发单抢单软件开发,类似滴滴打车抢单系统APP定制开发,类似滴滴打车抢单派单平台开发 从手机聊天.手机购物,再到打车应用.手机银行--移动互联网浪潮正在悄然改变我们的生活.零售.金融.交通等传统行业都在这个浪潮中或急或缓地转身.如今,快递行业也出现了移动互联网身影,这对该行业来说意味着什么? 近日,成都出现了新型的快递模式.通过下载一款手机应用软件,每个用户均可"抢单&qu

类似plustoken钱包系统开发,多币种钱包开发

了解数字资产钱包市场的用户大概都听说过plustoken,这款多币种钱包中,除了拥有传统的能够多储存数字资产的功能以外,还带有智能狗自动搬砖的功能,用户将数字资产存放在钱包系统里面,开启这一功能,在一定时间里就能够得到一定的静态收益,这也算得上是plustoken中独有的一种新功能,这样的自动搬砖模式能够让用户闲置在钱包里面的数字资产也能够得到一定的收益.现在很多用户想要开发类似于plustoken钱包系统,在开发之前,我们应该先了解这个钱包系统,里面究竟有哪些功能,而不是说我就要开发个一模一样