文档章节

android开发笔记之 仿优酷圆形菜单

Mr_Nice
 Mr_Nice
发布于 2016/05/22 20:00
字数 3221
阅读 5
收藏 0
点赞 2
评论 0

先来看看效果:

这里写图片描述

首先来分析一下:

这个菜单可以分成三个菜单:

1.一级菜单(即最内圈那个菜单)

2.二级菜单(即中间圈那个菜单)

3.三级菜单(即最外圈那个菜单)

首先,可以将这三个菜单使用相对布局

一级菜单只有一个按钮(即home),可以控制二级和三级菜单

二级菜单有三个按钮(即menu),中间那个按钮可以控制三级菜单

三级菜单有七个按钮

那先把布局文件先写出来,采用三个相对布局(即每个菜单采用一个相对布局)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.youkumenu.MainActivity" >

    <!-- 三级菜单 -->

    <RelativeLayout  android:id="@+id/level3_Rl" android:layout_width="220dp" android:layout_height="110dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:background="@drawable/level3" >

       <ImageView  android:id="@+id/channel1" android:layout_marginLeft="5dp" android:layout_alignParentBottom="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/channel1"/>
       <ImageView  android:id="@+id/channel2" android:layout_marginBottom="10dp" android:layout_marginLeft="25dp" android:layout_above="@id/channel1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/channel2"/>
       <ImageView  android:layout_marginBottom="1dp" android:layout_marginLeft="52dp" android:layout_above="@id/channel2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/channel3"/>
       <ImageView  android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/channel4"/>
       <ImageView  android:id="@+id/channel7" android:layout_marginRight="5dp" android:layout_alignParentRight="true" android:layout_alignParentBottom="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/channel7"/>
       <ImageView  android:id="@+id/channel6" android:layout_alignParentRight="true" android:layout_marginBottom="10dp" android:layout_marginRight="25dp" android:layout_above="@id/channel7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/channel6"/>
       <ImageView  android:layout_marginBottom="1dp" android:layout_marginRight="52dp" android:layout_alignParentRight="true" android:layout_above="@id/channel6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/channel5"/>
    </RelativeLayout>

    <!-- 二级菜单 -->

    <RelativeLayout  android:id="@+id/level2_Rl" android:layout_width="140dp" android:layout_height="70dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:background="@drawable/level2" >
        <ImageView  android:layout_marginLeft="3dp" android:layout_alignParentBottom="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon_search"/>
        <ImageView  android:id="@+id/menu_Iv" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon_menu"/>
        <ImageView  android:id="@+id/myyouku_Iv" android:layout_marginRight="3dp" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon_myyouku"/>

    </RelativeLayout>
    <!-- 一级菜单 -->

    <RelativeLayout  android:layout_width="80dp" android:layout_height="40dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:background="@drawable/level1" >

        <ImageView  android:id="@+id/home_Iv" android:layout_centerInParent="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon_home" />
    </RelativeLayout>

</RelativeLayout>

那好,布局写好,就能看到这样的效果,只不过现在只是静态的,没有加逻辑而已

这里写图片描述

下面就该来分析下逻辑了,先来看看home(即一级菜单中间那个按钮)

点击home,会有三种情况,下面分情况考虑:

1.二级、三级菜单都显示,就将二、三级菜单隐藏掉

2.二、三级菜单都不显示的时候,就将二级菜单显示

3.二级菜单显示且三级菜单不显示的时候,就将二级菜单隐藏

当然我们知道,要知道菜单隐藏或者显示,只需要设个标记位即可

那要如何隐藏或显示菜单,当然是使用动画了,可以使用补间动画

属性动画,我这里就使用补间动画

下面就该来分析下逻辑了,先来看看menu(即二级菜单中间那个按钮)

点击menu,会有三种情况,下面分情况考虑:

1.三级显示的时候,就将三级菜单隐藏

2.三级隐藏的时候,就将三级菜单显示

这个就比较简单了,就两种情况。

public class MainActivity extends Activity implements OnClickListener{
    //一级菜单中的home按钮
    private ImageView home_Iv;
    //二级菜单中的Menu按钮
    private ImageView menu_Iv;
    //用于判断二级菜单的显示状况,true为显示,false为隐藏
    private boolean level2ListPlay = true;
    //用于判断二级菜单的显示状况,true为显示,false为隐藏
    private boolean level3ListPlay = true;
    //二级和三级菜单
    private RelativeLayout level2_Rl,level3_Rl;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }   
    //初始化组件
    private void initView() {
        home_Iv = (ImageView) findViewById(R.id.home_Iv);
        home_Iv.setOnClickListener(this);

        level2_Rl = (RelativeLayout) findViewById(R.id.level2_Rl);
        level3_Rl = (RelativeLayout) findViewById(R.id.level3_Rl);

        menu_Iv = (ImageView) findViewById(R.id.menu_Iv);
        menu_Iv.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.home_Iv:      //点击home按钮的逻辑代码
            clickHomeIv();
            break;
        case R.id.menu_Iv:
            clickMenuIv();      //点击二级菜单中的menu按钮的逻辑代码
            break;
        default:
            break;
        }
    }
    //点击二级菜单中的menu按钮的逻辑代码
    private void clickMenuIv() {
        //分情况考虑
        //1.三级显示的时候,就将三级菜单隐藏
        if (level3ListPlay) {
            hideMenu(level3_Rl,0);
            level3ListPlay = false;
            return;
        }
        //2.三级隐藏的时候,就将三级菜单显示
        if (!level3ListPlay) {
            showMenu(level3_Rl);
            level3ListPlay = true;
            return;
        }
    }
    //点击一级菜单中的home按钮的逻辑代码
    private void clickHomeIv() {
        //分情况考虑
        //1.二级、三级菜单都显示,就将二、三级菜单隐藏掉
        if (level2ListPlay && level3ListPlay) {
            //将二三级菜单隐藏,并改变标记
            hideMenu(level2_Rl,300);
            hideMenu(level3_Rl,500);
            level2ListPlay = false;
            level3ListPlay = false;
            return;
        }
        //2.二、三级菜单都不显示的时候,就将二级菜单显示
        if (!level2ListPlay && !level3ListPlay) {
            showMenu(level2_Rl);
            level2ListPlay = true;
            return;
        }
        //3.二级菜单显示且三级菜单不显示的时候,就将二级菜单隐藏
        if (level2ListPlay && !level3ListPlay) {
            hideMenu(level2_Rl,0);
            level2ListPlay = false;
            return;
        }

    }
    /** * 显示菜单 * @param view 要显示的菜单 */
    private void showMenu(RelativeLayout view) {
// view.setVisibility(View.VISIBLE);
        //旋转动画
        RotateAnimation animation = new RotateAnimation(-180, 0, Animation.RELATIVE_TO_SELF, 
                0.5f, Animation.RELATIVE_TO_SELF, 1.0f);
        animation.setDuration(500);     //设置动画持续的时间
        animation.setFillAfter(true); //动画停留在动画结束的位置
        view.startAnimation(animation);
    }
    /** * 隐藏菜单 * @param view 要隐藏的菜单 ,startOffset 动画延迟执行的时间 */
    private void hideMenu(RelativeLayout view,long startOffset) {
// view.setVisibility(View.GONE);
        /** * 旋转动画 * RotateAnimation(fromDegrees, toDegrees, pivotXType, pivotXValue, pivotYType, pivotYValue) * fromDegrees 开始旋转角度 * toDegrees 旋转的结束角度 * pivotXType X轴 参照物 (X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF) * pivotXValue x轴 旋转的参考点(x坐标的伸缩值) * pivotYType Y轴 参照物 (Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF) * pivotYValue Y轴 旋转的参考点 ((Y坐标的伸缩值) ) */ 
        RotateAnimation animation = new RotateAnimation(0, -180, Animation.RELATIVE_TO_SELF, 
                0.5f, Animation.RELATIVE_TO_SELF, 1.0f);
        animation.setDuration(500);
        animation.setFillAfter(true); //动画停留在动画结束的位置
        animation.setStartOffset(startOffset);      //设置动画的延迟执行
        view.startAnimation(animation);
    }
}

写到这里,应该差不多可以看到效果了,但是细心的伙伴应该会发现两个

bug:

第一:当你快速点击一级菜单home按钮或二级菜单menu按钮的时候,

会发现二级菜单或三级菜单的第一次动画还没执行完,又执行第二次动

画,看起来就在晃一样。(原因:就是执行的动画都设定了一定时间,你

点击的时间快于动画执行的时间)

解决办法:

对动画进行监听,当动画开始执行和结束的时候,对它进行监听,大家应

该会想到用一个标记位来判断,可我们知道一个标记为只能判断两种状

态,可这里有两种动画(显示的动画和隐藏的动画),一个标记位肯定不

行,可以用一个Int值来控制

//用于记录有多少个动画在执行
    private int annimationCount = 0;
    //对动画进行监听的时候
    animation.setAnimationListener(new AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
// menu_Iv.setOnClickListener(null);
// home_Iv.setOnClickListener(null);
                annimationCount ++;
            }
            @Override
            public void onAnimationRepeat(Animation animation) {

            }
            @Override
            public void onAnimationEnd(Animation animation) {
// menu_Iv.setOnClickListener(MainActivity.this);
// home_Iv.setOnClickListener(MainActivity.this);
                annimationCount --;
            }
        //当点击的时候就可以进行判断,只要annimationCount值大于0,说明还有动画在执行
        if (annimationCount > 0) {
            return ;
        }

第二:当二级菜单隐藏的时候,你点击二级菜单中menu按钮(虽然现在看

不见)时,你会惊奇的发现三级菜单居然显示了。(原因:补间动画,没

有真正的改变组件的属性,而属性动画就不一样,大家有时间可以试试属

性动画做做)

解决办法:

只要当二级菜单隐藏的时候,就让二级菜单的所有选项按钮都不可点。因

为二级菜单有可以能有多个按钮,所以拿到父容器,去使它的子控件失去

焦点即可。

//如果要显示菜单,那么就将相应的控件设为有焦点
        //获取父容器中有几个子控件
        int childCount = view.getChildCount();
        for (int i = 0; i < childCount; i++) {
            view.getChildAt(i).setEnabled(true);
        }

写到这里就差不多了,大家可以试试

这里把我写的完整代码贴出来:


public class MainActivity extends Activity implements OnClickListener{
    //一级菜单中的home按钮
    private ImageView home_Iv;
    //二级菜单中的Menu按钮
    private ImageView menu_Iv;
    //用于判断二级菜单的显示状况,true为显示,false为隐藏
    private boolean level2ListPlay = true;
    //用于判断二级菜单的显示状况,true为显示,false为隐藏
    private boolean level3ListPlay = true;
    //二级和三级菜单
    private RelativeLayout level2_Rl,level3_Rl;
    //用于记录有多少个动画在执行
    private int annimationCount = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }   
    //初始化组件
    private void initView() {
        home_Iv = (ImageView) findViewById(R.id.home_Iv);
        home_Iv.setOnClickListener(this);

        level2_Rl = (RelativeLayout) findViewById(R.id.level2_Rl);
        level3_Rl = (RelativeLayout) findViewById(R.id.level3_Rl);

        menu_Iv = (ImageView) findViewById(R.id.menu_Iv);
        menu_Iv.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.home_Iv:      //点击home按钮的逻辑代码
            clickHomeIv();
            break;
        case R.id.menu_Iv:
            clickMenuIv();      //点击二级菜单中的menu按钮的逻辑代码
            break;
        default:
            break;
        }
    }
    //点击二级菜单中的menu按钮的逻辑代码
    private void clickMenuIv() {
        //当点击的时候就可以进行判断,只要annimationCount值大于0,说明还有动画在执行
        if (annimationCount > 0) {
            return ;
        }
        //分情况考虑
        //1.三级显示的时候,就将三级菜单隐藏
        if (level3ListPlay) {
            hideMenu(level3_Rl,0);
            level3ListPlay = false;
            return;
        }
        //2.三级隐藏的时候,就将三级菜单显示
        if (!level3ListPlay) {
            showMenu(level3_Rl);
            level3ListPlay = true;
            return;
        }
    }
    //点击一级菜单中的home按钮的逻辑代码
    private void clickHomeIv() {
        //当点击的时候就可以进行判断,只要annimationCount值大于0,说明还有动画在执行
        if (annimationCount > 0) {
            return ;
        }
        //分情况考虑
        //1.二级、三级菜单都显示,就将二、三级菜单隐藏掉
        if (level2ListPlay && level3ListPlay) {
            //将二三级菜单隐藏,并改变标记
            hideMenu(level2_Rl,300);
            hideMenu(level3_Rl,500);
            level2ListPlay = false;
            level3ListPlay = false;
            return;
        }
        //2.二、三级菜单都不显示的时候,就将二级菜单显示
        if (!level2ListPlay && !level3ListPlay) {
            showMenu(level2_Rl);
            level2ListPlay = true;
            return;
        }
        //3.二级菜单显示且三级菜单不显示的时候,就将二级菜单隐藏
        if (level2ListPlay && !level3ListPlay) {
            hideMenu(level2_Rl,0);
            level2ListPlay = false;
            return;
        }

    }
    /** * 显示菜单 * @param view 要显示的菜单 */
    private void showMenu(RelativeLayout view) {
// view.setVisibility(View.VISIBLE);
        //如果要显示菜单,那么就将相应的控件设为有焦点
        //获取父容器中有几个子控件
        int childCount = view.getChildCount();
        for (int i = 0; i < childCount; i++) {
            view.getChildAt(i).setEnabled(true);
        }
        //旋转动画
        RotateAnimation animation = new RotateAnimation(-180, 0, Animation.RELATIVE_TO_SELF, 
                0.5f, Animation.RELATIVE_TO_SELF, 1.0f);
        animation.setDuration(500);     //设置动画持续的时间
        animation.setFillAfter(true); //动画停留在动画结束的位置
        view.startAnimation(animation);
        animation.setAnimationListener(new AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                //动画开始的时候回调
// menu_Iv.setOnClickListener(null);
// home_Iv.setOnClickListener(null);
                annimationCount ++;
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                //动画执行过程调用
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                //动画结束的时候调用
// menu_Iv.setOnClickListener(MainActivity.this);
// home_Iv.setOnClickListener(MainActivity.this);
                annimationCount --;
            }
        });
    }
    /** * 隐藏菜单 * @param view 要隐藏的菜单 ,startOffset 动画延迟执行的时间 */
    private void hideMenu(RelativeLayout view,long startOffset) {
// view.setVisibility(View.GONE);
        //如果要隐藏菜单,那么就将相应的控件设为没有焦点
        //获取父容器中有几个子控件
        int childCount = view.getChildCount();
        for (int i = 0; i < childCount; i++) {
            view.getChildAt(i).setEnabled(false);
        }
        /** * 旋转动画 * RotateAnimation(fromDegrees, toDegrees, pivotXType, pivotXValue, pivotYType, pivotYValue) * fromDegrees 开始旋转角度 * toDegrees 旋转的结束角度 * pivotXType X轴 参照物 (X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF) * pivotXValue x轴 旋转的参考点(x坐标的伸缩值) * pivotYType Y轴 参照物 (Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF) * pivotYValue Y轴 旋转的参考点 ((Y坐标的伸缩值) ) */ 
        RotateAnimation animation = new RotateAnimation(0, -180, Animation.RELATIVE_TO_SELF, 
                0.5f, Animation.RELATIVE_TO_SELF, 1.0f);
        animation.setDuration(500);
        animation.setFillAfter(true); //动画停留在动画结束的位置
        animation.setStartOffset(startOffset);      //设置动画的延迟执行
        view.startAnimation(animation);
        animation.setAnimationListener(new AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
// menu_Iv.setOnClickListener(null);
// home_Iv.setOnClickListener(null);
                annimationCount ++;
            }
            @Override
            public void onAnimationRepeat(Animation animation) {

            }
            @Override
            public void onAnimationEnd(Animation animation) {
// menu_Iv.setOnClickListener(MainActivity.this);
// home_Iv.setOnClickListener(MainActivity.this);
                annimationCount --;
            }
        });
    }
}

布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.youkumenu.MainActivity" >

    <!-- 三级菜单 -->

    <RelativeLayout  android:id="@+id/level3_Rl" android:layout_width="220dp" android:layout_height="110dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:background="@drawable/level3" >

       <ImageView  android:id="@+id/channel1" android:layout_marginLeft="5dp" android:layout_alignParentBottom="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/channel1"/>
       <ImageView  android:id="@+id/channel2" android:layout_marginBottom="10dp" android:layout_marginLeft="25dp" android:layout_above="@id/channel1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/channel2"/>
       <ImageView  android:layout_marginBottom="1dp" android:layout_marginLeft="52dp" android:layout_above="@id/channel2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/channel3"/>
       <ImageView  android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/channel4"/>
       <ImageView  android:id="@+id/channel7" android:layout_marginRight="5dp" android:layout_alignParentRight="true" android:layout_alignParentBottom="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/channel7"/>
       <ImageView  android:id="@+id/channel6" android:layout_alignParentRight="true" android:layout_marginBottom="10dp" android:layout_marginRight="25dp" android:layout_above="@id/channel7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/channel6"/>
       <ImageView  android:layout_marginBottom="1dp" android:layout_marginRight="52dp" android:layout_alignParentRight="true" android:layout_above="@id/channel6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/channel5"/>
    </RelativeLayout>

    <!-- 二级菜单 -->

    <RelativeLayout  android:id="@+id/level2_Rl" android:layout_width="140dp" android:layout_height="70dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:background="@drawable/level2" >
        <ImageView  android:layout_marginLeft="3dp" android:layout_alignParentBottom="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon_search"/>
        <ImageView  android:id="@+id/menu_Iv" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon_menu"/>
        <ImageView  android:id="@+id/myyouku_Iv" android:layout_marginRight="3dp" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon_myyouku"/>

    </RelativeLayout>
    <!-- 一级菜单 -->

    <RelativeLayout  android:layout_width="80dp" android:layout_height="40dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:background="@drawable/level1" >

        <ImageView  android:id="@+id/home_Iv" android:layout_centerInParent="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon_home" />
    </RelativeLayout>

</RelativeLayout>

仿优酷菜单源码:下载

© 著作权归作者所有

共有 人打赏支持
Mr_Nice
粉丝 0
博文 47
码字总数 39947
作品 0
广州
安卓巴士Android开发者门户

一、开源库 1.SimpleRatingBar 简单好用的ratingbar 2.NumberRain Android自定义控件仿黑客帝国数字雨 3.CacheWebView 突破系统WebView缓存的空间限制的WebView 4.lucklypopupwindow Android...

迷你芊宝宝 ⋅ 前天 ⋅ 0

android高仿抖音、点餐界面、天气项目、自定义view指示、爬取美女图片等源码

Android精选源码 一个爬取美女图片的app(http://www.apkbus.com/thread-600077-1-1.html) Android高仿抖音(http://www.apkbus.com/thread-600081-1-1.html) android一个可以上拉下滑的Ui效果......

逆鳞龙 ⋅ 06/12 ⋅ 0

张高兴的 Xamarin.Android 学习笔记:(一)环境配置

  最近在自学 Xamarin 和 Android ,同时发现国内在做 Xamarin 的不多。我在自学中间遇到了很多问题,而且百度到的很多教程也有些过时,现在打算写点东西稍微总结下,顺便帮后人指指路了。...

张高兴 ⋅ 2017/01/13 ⋅ 0

Android Jetpack 助推应用开发 | 中文字幕视频介绍

Android Jetpack 能帮助您加快应用开发速度,处理类似后台任务、UI 导航以及生命周期管理之类的活动,免去开发者编写样板代码的麻烦,专注提升应用体验。这次发布的 Android Jetpack 组件覆盖...

Android_开发者 ⋅ 05/14 ⋅ 0

android开发常用工具类、高仿客户端、附近厕所、验证码助手、相机图片处理等源码

Android精选源码 android开发过程经常要用的工具类源码(http://www.apkbus.com/thread-599826-1-1.html) Android类似QQ空间个人主页下拉头部放大的布局效果(http://www.apkbus.com/thread-5...

逆鳞龙 ⋅ 05/29 ⋅ 0

Android UI 特效大全

Android UI特效大全 总体传送门:http://git.oschina.net/bob4j/Android-UI 基本上项目中都有效果图可自行查看 , 并且有些项目中都有README.md 文件,使用前请先阅读以下。 1.弧形(圆形)菜单...

不正经啊不正经 ⋅ 2015/07/31 ⋅ 0

[图]Chrome OS启用新版系统托盘菜单:优化触控操作

Chromium的技术传道者François Beaufort今天在Google+上透露,Chrome OS团队正为Chromebook所用系统研发全新设计的系统菜单。Google旗下的Chrome OS生态系统近年来发展迅猛,尤其是在教育市...

稿源: ⋅ 06/19 ⋅ 0

Android开发权威指南(第2版)新书发布

《Android开发权威指南(第二版)》是畅销书《Android开发权威指南》的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45章精彩内容供读者学习。  《Android开发权威指...

androidguy ⋅ 2013/09/05 ⋅ 0

android仿摩拜单车APP、炫酷RecyclerView、卡片滑动、仿饿了么点餐、自定义索引等源码

Android精选源码 Android自定义索引源码(http://www.apkbus.com/thread-599163-1-1.html) LayoutManager实现的卡片滑动(http://www.apkbus.com/thread-599396-1-1.html) android仿摩拜单车A......

逆鳞龙 ⋅ 05/22 ⋅ 0

android蓝牙手柄、仿QQ看房、仿慕课网、数据库二维码框架等源码

Android精选源码 可自定义图片指示器并支持自定义Tab宽度的TabLayout源码(http://www.apkbus.com/thread-599243-1-1.html) android蓝牙控制手柄操作源码(http://www.apkbus.com/thread-59928...

逆鳞龙 ⋅ 05/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部