开源库【ViewPagerIndicator】配合ViewPager使用的圆点指示器,圆点随滑动而移动
来源:互联网 发布:ppt 触发器 mac 设置 编辑:程序博客网 时间:2024/06/07 05:18
效果演示
华为手机上的时钟
ViewPagerIndicator
简单描述
灵感来自于华为手机上的多款自带APP,都有这种圆点指示器(如图1的时钟),感觉很6,就仿造弄了个库出来。
配合ViewPager使用,每滑到另一页并停止时,随机改变圆点颜色,内置了5种颜色。
如果页面没变,停止时颜色不会改变,圆点的颜色也可以自行设置.
技术分析
ViewPager滑动过程分析
既然是配合ViewPager
使用的,首先得清楚滑动时都发生了啥,那我们就添加如下的打印代码:
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { Log.d("onPageScrolled", "position =" + position + " \n offset =" + positionOffset); } @Override public void onPageSelected(int position) { Log.d("onPageSelected", String.valueOf(position)); } @Override public void onPageScrollStateChanged(int state) { switch (state) { case ViewPager.SCROLL_STATE_DRAGGING: Log.d("onPageScrollStateChanged", "SCROLL_STATE_DRAGGING"); break; case ViewPager.SCROLL_STATE_IDLE: Log.d("onPageScrollStateChanged", "SCROLL_STATE_IDLE"); break; case ViewPager.SCROLL_STATE_SETTLING: Log.d("onPageScrollStateChanged", "SCROLL_STATE_SETTLING"); break; default: break; } } });
接着各种滑动,看看都输出了啥
先是滑到右边的页面
第1页滑到第2页
12-23 21:17:45.360 12033-12033/sbingo.com.viewpagerindicator D/onPageScrollStateChanged: SCROLL_STATE_DRAGGING12-23 21:17:45.360 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.0527777812-23 21:17:45.370 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.1111111112-23 21:17:45.390 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.1847222112-23 21:17:45.410 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.2722222212-23 21:17:45.420 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.3722222112-23 21:17:45.430 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.3777777912-23 21:17:45.430 12033-12033/sbingo.com.viewpagerindicator D/onPageScrollStateChanged: SCROLL_STATE_SETTLING12-23 21:17:45.430 12033-12033/sbingo.com.viewpagerindicator D/onPageSelected: 112-23 21:17:45.440 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.451388912-23 21:17:45.460 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.5791666512-23 21:17:45.470 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.680555612-23 21:17:45.490 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.7666666512-23 21:17:45.500 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.8291666512-23 21:17:45.520 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.8805555712-23 21:17:45.540 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.9208333512-23 21:17:45.560 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.945833312-23 21:17:45.570 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.963888912-23 21:17:45.590 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.977777812-23 21:17:45.600 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.987512-23 21:17:45.620 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.993055612-23 21:17:45.640 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.9958333412-23 21:17:45.650 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.998611112-23 21:17:45.670 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.012-23 21:17:45.780 12033-12033/sbingo.com.viewpagerindicator D/onPageScrollStateChanged: SCROLL_STATE_IDLE
第2页滑到第3页
12-23 21:19:13.630 12033-12033/sbingo.com.viewpagerindicator D/onPageScrollStateChanged: SCROLL_STATE_DRAGGING12-23 21:19:13.630 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.01805555812-23 21:19:13.650 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.04999995212-23 21:19:13.660 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.091666712-23 21:19:13.680 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.1444444712-23 21:19:13.700 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.2027777412-23 21:19:13.710 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.2722222812-23 21:19:13.730 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.3541666312-23 21:19:13.750 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.4486111412-23 21:19:13.750 12033-12033/sbingo.com.viewpagerindicator D/onPageScrollStateChanged: SCROLL_STATE_SETTLING12-23 21:19:13.750 12033-12033/sbingo.com.viewpagerindicator D/onPageSelected: 212-23 21:19:13.750 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.4569444712-23 21:19:13.760 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.556944512-23 21:19:13.780 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.654166712-23 21:19:13.800 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.7333333512-23 21:19:13.810 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.7999999512-23 21:19:13.830 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.852777712-23 21:19:13.840 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.8930555612-23 21:19:13.860 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.9236111612-23 21:19:13.880 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.9472222312-23 21:19:13.890 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.963888912-23 21:19:13.910 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.9763889312-23 21:19:13.930 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.9847222612-23 21:19:13.940 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.991666712-23 21:19:13.960 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.994444512-23 21:19:13.980 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.997222212-23 21:19:13.990 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.998611112-23 21:19:14.010 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =2 offset =0.012-23 21:19:14.140 12033-12033/sbingo.com.viewpagerindicator D/onPageScrollStateChanged: SCROLL_STATE_IDLE
接着往回滑到左边的页面
第3页滑到第2页
12-23 21:21:43.460 12033-12033/sbingo.com.viewpagerindicator D/onPageScrollStateChanged: SCROLL_STATE_DRAGGING12-23 21:21:43.460 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.970833312-23 21:21:43.480 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.931944512-23 21:21:43.490 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.883333312-23 21:21:43.510 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.815277812-23 21:21:43.520 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.751388912-23 21:21:43.520 12033-12033/sbingo.com.viewpagerindicator D/onPageScrollStateChanged: SCROLL_STATE_SETTLING12-23 21:21:43.520 12033-12033/sbingo.com.viewpagerindicator D/onPageSelected: 112-23 21:21:43.530 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.7347222612-23 21:21:43.540 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.6083333512-23 21:21:43.560 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.494444512-23 21:21:43.570 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.402777812-23 21:21:43.590 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.3222222312-23 21:21:43.610 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.2583333312-23 21:21:43.620 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.2013888412-23 21:21:43.640 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.156944412-23 21:21:43.660 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.12222218512-23 21:21:43.670 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.09305560612-23 21:21:43.690 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.0680555112-23 21:21:43.700 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.04999995212-23 21:21:43.720 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.03611111612-23 21:21:43.740 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.02499997612-23 21:21:43.750 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.0166666512-23 21:21:43.770 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.0111111412-23 21:21:43.790 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.00694441812-23 21:21:43.800 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.004166722312-23 21:21:43.820 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.002777814912-23 21:21:43.840 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.001388907412-23 21:21:43.850 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =1 offset =0.012-23 21:21:44.000 12033-12033/sbingo.com.viewpagerindicator D/onPageScrollStateChanged: SCROLL_STATE_IDLE
第2页滑到第1页
12-23 21:22:44.870 12033-12033/sbingo.com.viewpagerindicator D/onPageScrollStateChanged: SCROLL_STATE_DRAGGING12-23 21:22:44.870 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.979166712-23 21:22:44.880 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.951388912-23 21:22:44.900 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.897222212-23 21:22:44.910 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.8027777712-23 21:22:44.930 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.687512-23 21:22:44.930 12033-12033/sbingo.com.viewpagerindicator D/onPageScrollStateChanged: SCROLL_STATE_SETTLING12-23 21:22:44.930 12033-12033/sbingo.com.viewpagerindicator D/onPageSelected: 012-23 21:22:44.950 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.5333333612-23 21:22:44.960 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.4013888812-23 21:22:44.980 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.2972222312-23 21:22:45.000 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.2111111112-23 21:22:45.010 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.1512-23 21:22:45.030 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.0986111112-23 21:22:45.050 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.0666666712-23 21:22:45.060 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.04166666812-23 21:22:45.080 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.0263888912-23 21:22:45.090 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.01527777812-23 21:22:45.110 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.00833333412-23 21:22:45.130 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.00416666712-23 21:22:45.140 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.001388888912-23 21:22:45.160 12033-12033/sbingo.com.viewpagerindicator D/onPageScrolled: position =0 offset =0.012-23 21:22:45.270 12033-12033/sbingo.com.viewpagerindicator D/onPageScrollStateChanged: SCROLL_STATE_IDLE
滑动结果分析
看了以上的输出结果后,我们可以得出以下的滑动流程:
手指开始滑动的瞬间回调
onPageScrollStateChanged:SCROLL_STATE_DRAGGING
,”ViewPager”说:我状态变了,要开始滑动啦~!接着在滑动中一直回调
onPageScrolled
,其中的position
是当前两个可见页面中左边一页的位置值,offset
是当前滑动位置距离position
的距离,取值范围在0-1之间。在滑动中的某个瞬间回调
onPageScrollStateChanged: SCROLL_STATE_SETTLING
,”ViewPager”说:我要设置新的页面啦~!话音刚落,又回调了onPageSelected
,设置好了它预想的新页面。But,如果又滑到原始的页面并不会再回调此处,这种情况下最终的页面就会和onPageSelected
中的页面不一致。~也就是说这里只会回调一次!接着继续在滑动中回调
onPageScrolled
,和2中一样了。最后一次回到
onPageScrolled
,此时position
为新页面的位置值,offset
为0。最终滑到新的一页,回调
onPageScrollStateChanged: SCROLL_STATE_IDLE
,”ViewPager”说:滑得好累啊,终于到目的地啦~我要停下来歇息一会儿了!以上就是一次完整的滑动过程。
圆点x坐标分解
现在我们来分析怎样绘制圆点,很简单,知道圆心坐标+半径就可以了。
半径我取view高度的1/3,圆心y坐标必然是view高度1/2,重点就在于圆心的x坐标了。
看下面我画的圆点位置图来分析下x坐标:
假设共有n个可滑动的页面,不滑动时圆点应该在图中1、2、……n其中一个位置上,即标题的正中间。
两个相邻位置的距离为width/n
。
滑动时可能在1-2之间的X位置,2-3之间的Y位置。
这里我将x坐标的计算分为两部分:currentStartX
和offsetX
,由它们相加可以得到x坐标。
currentStartX
以1、2、……等位置为计算依据,停止滑动时,offsetX
为0。
初始位置1为startX
。
代码实现
先看一下要用到的一些变量:
/** * 绘图中心X坐标的百分比值 */ private float mPercentX = 0f; /** * 画笔颜色数组 */ private int[] colors = {Color.BLUE, Color.BLACK, Color.GREEN, Color.YELLOW, Color.RED}; /** * 随机生成的画笔颜色序号 */ private int colorIndex = 0; /** * 当前画笔颜色序号 */ private int currentColorIndex = 0; /** * 页数 */ private int pageCount; /** * 初始计算起始点 */ private float startX; /** * 当前计算起始点 */ private float currentStartX; /** * X方向偏移量 */ private float offsetX; /** * 某次滑动是否停止 */ private boolean isIdle; /** * 当前页码 */ private int currentPageIndex;
提供一个方法用于设置页数,知道了页数才能开心地计算嘛~:
public void setPageCount(int pageCount) { this.pageCount = pageCount; }
初始化起始位置:
@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { startX = currentStartX = getWidth() / (2f * pageCount); }
定义滑动时在onPageScrolled
中调用的方法,传入的percentX
就是之前分析过的offset
,注意计算基准要实时更新,当position < currentPageIndex
时说明在往回滑动,计算基准currentStartX
要左移一个单位(圆点停止时的相邻位置距离),其他处理也都写了注释,相信不难理解。
public void drawPoint(int position, float percentX) { //实时更新计算基准 //往回滑动时,计算基准减一个单位 if (position < currentPageIndex) { currentStartX = startX + (currentPageIndex - 1) * getWidth() / pageCount; } else { //往后滑动时,计算基准不变 currentStartX = startX + currentPageIndex* getWidth() / pageCount; } //防止滑动停止时出现绘制在起点的问题 if (mPercentX > 0.9 && percentX == 0) { return; } //防止过度绘制,尤其是在边界处 if (mPercentX == percentX) { return; } this.mPercentX = percentX; invalidate(); }
当滑动停止时,上面的方法不会起作用。我们再提供一个方法,用于在SCROLL_STATE_IDLE
时使用。
public void setCurrentPageIndex(int index) { //只在滑到另一页时绘制 if (currentPageIndex == index) return; currentPageIndex = index; currentStartX = startX + index * getWidth() / pageCount; isIdle = true; changeColor(); invalidate(); }
停止时更新当前计算基准currentStartX
,同时换色,更换颜色的方法如下:
private void changeColor() { //保证换一个颜色 while (currentColorIndex == colorIndex) { colorIndex = new Random().nextInt(colors.length); } currentColorIndex = colorIndex; if (currentColorIndex <= colors.length - 1) { mPaint.setColor(colors[currentColorIndex]); } }
最后来看一下绘制代码:
@Override protected void onDraw(Canvas canvas) { if (pageCount < 1) { throw new RuntimeException("ViewPagerIndicator_非法页数!"); } if (isIdle) { offsetX = 0f; isIdle = false; } else { offsetX = mPercentX * getWidth() / pageCount; } canvas.drawCircle(currentStartX + offsetX, getHeight() / 2, getHeight() / 3, mPaint); }
正如之前的坐标分解,停止时将offsetX
置0,滑动时根据滑动百分比计算offsetX
,再通过currentStartX + offsetX
得到当前的x坐标。
以上,就实现了我们预期的功能~
下面是这个库的使用方法
库使用方法
- 在项目根 build.gradle 添加:
allprojects { repositories { ... maven { url "https://jitpack.io" } }}
- 在要使用的模块中添加依赖:
compile 'com.github.Sbingo:ViewPagerIndicator:2.0.0'
- 在布局中使用:
<sbingo.com.mylibrary.ViewPagerIndicator android:id="@+id/vp_indicator" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@id/radio_group"/>
- 在代码中控制:
private boolean fromRadioGroup; radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.item1: if (viewPager.getCurrentItem() != 0) { fromRadioGroup = true; //防止直接点击tab时,会一路调用"onPageScrolled",造成绘制效果不好,目前只能这样控制…… viewPager.setCurrentItem(0); } break; ...... ...... ...... default: } } }) int[] colors = {Color.CYAN, Color.LTGRAY}; vpIndicator.setColors(colors); //可以设置喜欢的颜色,但每次也是随机的: vpIndicator.setPageCount(4); //第一步:设置ViewPager的页数 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (!fromRadioGroup) { vpIndicator.drawPoint(position,positionOffset); //第二步:滑动时绘制圆点 } } @Override public void onPageSelected(int position) { ((RadioButton) radioGroup.getChildAt(position)).setChecked(true); currentIndex = position; } @Override public void onPageScrollStateChanged(int state) { switch (state) { case ViewPager.SCROLL_STATE_IDLE: vpIndicator.setCurrentPageIndex(currentIndex); //第三步:停止时绘制圆点 fromRadioGroup = false; break; default: } } });
完整源码和demo点这里
如果觉得有用,不妨顺手点个Star吧,谢啦~
- 开源库【ViewPagerIndicator】配合ViewPager使用的圆点指示器,圆点随滑动而移动
- 配合viewpager使用的指示器PagerIndicator
- viewpager的圆点指示器
- 仿米UI的ViewPagerIndicator ViewPager指示器
- ViewPagerIndicator+viewpager指示器详解
- ViewPagerIndicator(ViewPager指示器)
- viewpagerindicator ViewPager指示器
- ViewPagerIndicator+viewpager指示器详解
- viewpager+viewpagerindicator的使用
- ViewPager滑动跟随的指示器
- 带指示器的viewpager----ViewPagerIndicator的改进版
- 自定义ViewPagerIndicator---炫酷的导航栏指示器+ViewPager+Fragment
- ViewPager底部圆点指示器
- 跟随滑动ViewPager指示器(小圆点跟随滑动效果)
- ViewPagerIndicator的指示器应用
- android 中 viewpager 滑动的指示器
- android 中 viewpager 滑动的指示器
- 使用PagerTabStrip配合ViewPager实现左右滑动标题栏的效果
- 实模式和保护模式
- 【51NOD 1789】 跑的比谁都快
- 六、struts2的处理流程
- Storm中的worker Executor Task
- 关于BIOS的入口地址0xFFFF0
- 开源库【ViewPagerIndicator】配合ViewPager使用的圆点指示器,圆点随滑动而移动
- (更新)小波来教你:两台电脑怎么用一根网线连接组成局域网共享·多图·详细·速速围观【申明:来源于网络】
- Riak Erlang虚拟机调优(译)
- 【3.16XJ模拟题】坦克
- MQTT学习2——基础知识
- 离散对数加密算法
- 七、为应用指定多个struts配置文件
- Sublime Text 3 常用插件以及安装方法
- 八、动态方法的调用和使用通配符定义action