今天在github里看到一个3D效果的ViewPager,感觉做出来的ViewPager滑动的时候效果十分的炫,就check out下来研究了一下怎样实现的。以及怎样使用。将整个ViewPager稍加改动后(主要是处理了一下与项目中其他控滑动控件的事件冲突)后。应用到了自己如今项目中。感觉这个效果真的很的不错。如今把自己写的一个Demo分享出来。

 以下是这个ViewPager嵌入到项目中的效果图:

 

改动以后。在切换ViewPager时会有立体感。会为自己的应用增色不少。以下把使用的Demo发出来。事实上与使用普通的ViewPager全然一样。仅仅只是好像仅仅能用PagerAdapter及其子类Adapter为它填充数据。

1.ViewPager3D源代码:

  1. public class ViewPager3D extends ViewPager
  2. {
  3. /**
  4. * maximum overscroll rotation of the children is 90 divided by this value
  5. */
  6. final static float DEFAULT_OVERSCROLL_ROTATION = 2f;
  7.  
  8. /**
  9. * maximum z distance to translate child view
  10. */
  11. final static int DEFAULT_OVERSCROLL_TRANSLATION = 150;
  12.  
  13. /**
  14. * maximum z distanze during swipe
  15. */
  16. final static int DEFAULT_SWIPE_TRANSLATION = 100;
  17.  
  18. /**
  19. * maximum rotation during swipe is 90 divided by this value
  20. */
  21. final static float DEFAULT_SWIPE_ROTATION = 3;
  22.  
  23. /**
  24. * duration of overscroll animation in ms
  25. */
  26. final private static int DEFAULT_OVERSCROLL_ANIMATION_DURATION = 400;
  27.  
  28. /**
  29. * if true alpha of children gets animated during swipe and overscroll
  30. */
  31. final private static boolean DEFAULT_ANIMATE_ALPHA = true;
  32.  
  33. @SuppressWarnings("unused")
  34. private final static String DEBUG_TAG = ViewPager.class.getSimpleName();
  35. private final static int INVALID_POINTER_ID = -1;
  36. private final static double RADIANS = 180f / Math.PI;
  37.  
  38. /**
  39. * @author renard
  40. */
  41. private class OverscrollEffect
  42. {
  43. private float mOverscroll;
  44. private Animator mAnimator;
  45.  
  46. /**
  47. * @param deltaDistance [0..1] 0->no overscroll, 1>full overscroll
  48. */
  49. public void setPull(final float deltaDistance)
  50. {
  51. mOverscroll = deltaDistance;
  52. invalidateVisibleChilds();
  53. }
  54.  
  55. /**
  56. * called when finger is released. starts to animate back to default
  57. * position
  58. */
  59. private void onRelease()
  60. {
  61. if (mAnimator != null && mAnimator.isRunning())
  62. {
  63. mAnimator.addListener(new AnimatorListener()
  64. {
  65.  
  66. @Override
  67. public void onAnimationStart(Animator animation)
  68. {
  69. }
  70.  
  71. @Override
  72. public void onAnimationRepeat(Animator animation)
  73. {
  74. }
  75.  
  76. @Override
  77. public void onAnimationEnd(Animator animation)
  78. {
  79. startAnimation(0);
  80. }
  81.  
  82. @Override
  83. public void onAnimationCancel(Animator animation)
  84. {
  85. }
  86. });
  87. mAnimator.cancel();
  88. }
  89. else
  90. {
  91. startAnimation(0);
  92. }
  93. }
  94.  
  95. private void startAnimation(final float target)
  96. {
  97. mAnimator = ObjectAnimator.ofFloat(this, "pull", mOverscroll, target);
  98. mAnimator.setInterpolator(new DecelerateInterpolator());
  99. final float scale = Math.abs(target - mOverscroll);
  100. mAnimator.setDuration((long) (mOverscrollAnimationDuration * scale));
  101. mAnimator.start();
  102. }
  103.  
  104. private boolean isOverscrolling()
  105. {
  106. if (mScrollPosition == 0 && mOverscroll < 0)
  107. {
  108. return true;
  109. }
  110. if (getAdapter() != null)
  111. {
  112. final boolean isLast = (getAdapter().getCount() - 1) == mScrollPosition;
  113. if (isLast && mOverscroll > 0)
  114. {
  115. return true;
  116. }
  117. }
  118. return false;
  119. }
  120.  
  121. }
  122.  
  123. final private OverscrollEffect mOverscrollEffect = new OverscrollEffect();
  124. final private Camera mCamera = new Camera();
  125.  
  126. private OnPageChangeListener mScrollListener;
  127. private float mLastMotionX;
  128. private int mActivePointerId;
  129. private int mScrollPosition;
  130. private float mScrollPositionOffset;
  131. private int mScrollPositionOffsetPixels;
  132. final private int mTouchSlop;
  133.  
  134. private float mOverscrollRotation;
  135. private float mSwipeRotation;
  136. private int mOverscrollTranslation;
  137. private int mSwipeTranslation;
  138. private int mOverscrollAnimationDuration;
  139. private boolean mAnimateAlpha;
  140. private Rect mTempTect = new Rect();
  141.  
  142. public ViewPager3D(Context context, AttributeSet attrs)
  143. {
  144. super(context, attrs);
  145. setStaticTransformationsEnabled(true);
  146. final ViewConfiguration configuration = ViewConfiguration.get(context);
  147. mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration);
  148. super.setOnPageChangeListener(new MyOnPageChangeListener());
  149. init(attrs);
  150. }
  151.  
  152. private void init(AttributeSet attrs)
  153. {
  154. TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ViewPager3D);
  155. mOverscrollRotation = a.getFloat(R.styleable.ViewPager3D_overscroll_rotation, DEFAULT_OVERSCROLL_ROTATION);
  156. mSwipeRotation = a.getFloat(R.styleable.ViewPager3D_swipe_rotation, DEFAULT_SWIPE_ROTATION);
  157. mSwipeTranslation = a.getInt(R.styleable.ViewPager3D_swipe_translation, DEFAULT_SWIPE_TRANSLATION);
  158. mOverscrollTranslation = a.getInt(R.styleable.ViewPager3D_overscroll_translation,
  159. DEFAULT_OVERSCROLL_TRANSLATION);
  160. mOverscrollAnimationDuration = a.getInt(R.styleable.ViewPager3D_overscroll_animation_duration,
  161. DEFAULT_OVERSCROLL_ANIMATION_DURATION);
  162. mAnimateAlpha = a.getBoolean(R.styleable.ViewPager3D_animate_alpha, DEFAULT_ANIMATE_ALPHA);
  163. a.recycle();
  164. }
  165.  
  166. public boolean isAnimateAlpha()
  167. {
  168. return mAnimateAlpha;
  169. }
  170.  
  171. public void setAnimateAlpha(boolean mAnimateAlpha)
  172. {
  173. this.mAnimateAlpha = mAnimateAlpha;
  174. }
  175.  
  176. public int getOverscrollAnimationDuration()
  177. {
  178. return mOverscrollAnimationDuration;
  179. }
  180.  
  181. public void setOverscrollAnimationDuration(int mOverscrollAnimationDuration)
  182. {
  183. this.mOverscrollAnimationDuration = mOverscrollAnimationDuration;
  184. }
  185.  
  186. public int getSwipeTranslation()
  187. {
  188. return mSwipeTranslation;
  189. }
  190.  
  191. public void setSwipeTranslation(int mSwipeTranslation)
  192. {
  193. this.mSwipeTranslation = mSwipeTranslation;
  194. }
  195.  
  196. public int getOverscrollTranslation()
  197. {
  198. return mOverscrollTranslation;
  199. }
  200.  
  201. public void setOverscrollTranslation(int mOverscrollTranslation)
  202. {
  203. this.mOverscrollTranslation = mOverscrollTranslation;
  204. }
  205.  
  206. public float getSwipeRotation()
  207. {
  208. return mSwipeRotation;
  209. }
  210.  
  211. public void setSwipeRotation(float mSwipeRotation)
  212. {
  213. this.mSwipeRotation = mSwipeRotation;
  214. }
  215.  
  216. public float getOverscrollRotation()
  217. {
  218. return mOverscrollRotation;
  219. }
  220.  
  221. public void setOverscrollRotation(float mOverscrollRotation)
  222. {
  223. this.mOverscrollRotation = mOverscrollRotation;
  224. }
  225.  
  226. @Override
  227. public void setOnPageChangeListener(OnPageChangeListener listener)
  228. {
  229. mScrollListener = listener;
  230. }
  231.  
  232. ;
  233.  
  234. private void invalidateVisibleChilds()
  235. {
  236. for (int i = 0; i < getChildCount(); i++)
  237. {
  238. final View childAt = getChildAt(i);
  239. childAt.getLocalVisibleRect(mTempTect);
  240. final int area = mTempTect.width() * mTempTect.height();
  241. if (area > 0)
  242. {
  243. childAt.invalidate();
  244. }
  245. }
  246.  
  247. invalidate();
  248. }
  249.  
  250. private class MyOnPageChangeListener implements OnPageChangeListener
  251. {
  252.  
  253. @Override
  254. public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
  255. {
  256. if (mScrollListener != null)
  257. {
  258. mScrollListener.onPageScrolled(position, positionOffset, positionOffsetPixels);
  259. }
  260. mScrollPosition = position;
  261. mScrollPositionOffset = positionOffset;
  262. mScrollPositionOffsetPixels = positionOffsetPixels;
  263. // Log.i(DEBUG_TAG, "mScrollPosition = " + position + " offset = " + String.format("%f.2", positionOffset));
  264. // Log.i(DEBUG_TAG, "onPageScrolled");
  265.  
  266. invalidateVisibleChilds();
  267. }
  268.  
  269. @Override
  270. public void onPageSelected(int position)
  271. {
  272. if (mScrollListener != null)
  273. {
  274. mScrollListener.onPageSelected(position);
  275. }
  276. }
  277.  
  278. @Override
  279. public void onPageScrollStateChanged(final int state)
  280. {
  281. if (mScrollListener != null)
  282. {
  283. mScrollListener.onPageScrollStateChanged(state);
  284. }
  285. if (state == SCROLL_STATE_IDLE)
  286. {
  287. mScrollPositionOffset = 0;
  288. }
  289. }
  290. }
  291.  
  292. @Override
  293. public boolean onInterceptTouchEvent(MotionEvent ev)
  294. {
  295. final int action = ev.getAction() & MotionEventCompat.ACTION_MASK;
  296. switch (action)
  297. {
  298. case MotionEvent.ACTION_DOWN:
  299. {
  300. mLastMotionX = ev.getX();
  301. mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
  302. break;
  303. }
  304. case MotionEventCompat.ACTION_POINTER_DOWN:
  305. {
  306. final int index = MotionEventCompat.getActionIndex(ev);
  307. final float x = MotionEventCompat.getX(ev, index);
  308. mLastMotionX = x;
  309. mActivePointerId = MotionEventCompat.getPointerId(ev, index);
  310. break;
  311. }
  312. }
  313. return super.onInterceptTouchEvent(ev);
  314. }
  315.  
  316. @Override
  317. public boolean onTouchEvent(MotionEvent ev)
  318. {
  319. boolean callSuper = false;
  320.  
  321. final int action = ev.getAction();
  322. switch (action)
  323. {
  324. case MotionEvent.ACTION_DOWN:
  325. {
  326. callSuper = true;
  327. mLastMotionX = ev.getX();
  328. mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
  329. break;
  330. }
  331. case MotionEventCompat.ACTION_POINTER_DOWN:
  332. {
  333. callSuper = true;
  334. final int index = MotionEventCompat.getActionIndex(ev);
  335. final float x = MotionEventCompat.getX(ev, index);
  336. mLastMotionX = x;
  337. mActivePointerId = MotionEventCompat.getPointerId(ev, index);
  338. break;
  339. }
  340. case MotionEvent.ACTION_MOVE:
  341. {
  342. if (mActivePointerId != INVALID_POINTER_ID)
  343. {
  344. // Scroll to follow the motion event
  345. final int activePointerIndex = MotionEventCompat.findPointerIndex(ev, mActivePointerId);
  346. final float x = MotionEventCompat.getX(ev, activePointerIndex);
  347. final float deltaX = mLastMotionX - x;
  348. final int width = getWidth();
  349. final int widthWithMargin = width + getPageMargin();
  350. final int lastItemIndex = getAdapter().getCount() - 1;
  351. final int currentItemIndex = getCurrentItem();
  352. final float leftBound = Math.max(0, (currentItemIndex - 1) * widthWithMargin);
  353. final float rightBound = Math.min(currentItemIndex + 1, lastItemIndex) * widthWithMargin;
  354. if (mScrollPositionOffset == 0)
  355. {
  356. if (currentItemIndex == 0)
  357. {
  358. if (leftBound == 0)
  359. {
  360. final float over = deltaX + mTouchSlop;
  361. mOverscrollEffect.setPull(over / width);
  362. }
  363. }
  364. else if (lastItemIndex == currentItemIndex)
  365. {
  366. if (rightBound == lastItemIndex * widthWithMargin)
  367. {
  368. final float over = deltaX - mTouchSlop;
  369. mOverscrollEffect.setPull(over / width);
  370. }
  371. }
  372. }
  373. else
  374. {
  375. mLastMotionX = x;
  376. }
  377. }
  378. else
  379. {
  380. mOverscrollEffect.onRelease();
  381. }
  382. break;
  383. }
  384. case MotionEvent.ACTION_UP:
  385. case MotionEvent.ACTION_CANCEL:
  386. {
  387. callSuper = true;
  388. mActivePointerId = INVALID_POINTER_ID;
  389. mOverscrollEffect.onRelease();
  390. break;
  391. }
  392. case MotionEvent.ACTION_POINTER_UP:
  393. {
  394. final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
  395. final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex);
  396. if (pointerId == mActivePointerId)
  397. {
  398. // This was our active pointer going up. Choose a new
  399. // active pointer and adjust accordingly.
  400. final int newPointerIndex = pointerIndex == 0 ?
  401.  
  402. 1 : 0;
  403. mLastMotionX = ev.getX(newPointerIndex);
  404. mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex);
  405. callSuper = true;
  406. }
  407. break;
  408. }
  409. }
  410.  
  411. if (mOverscrollEffect.isOverscrolling() && !callSuper)
  412. {
  413. return true;
  414. }
  415. else
  416. {
  417. try
  418. {
  419. return super.onTouchEvent(ev);
  420. }
  421. catch (IllegalArgumentException ignore)
  422. {
  423. }
  424. catch (ArrayIndexOutOfBoundsException ignore)
  425. {
  426. }
  427. return false;
  428. }
  429. }
  430.  
  431. @Override
  432. protected boolean getChildStaticTransformation(View child, Transformation t)
  433. {
  434. if (child.getWidth() == 0)
  435. {
  436. return false;
  437. }
  438.  
  439. final boolean isFirstOrLast = mScrollPosition == 0 || (mScrollPosition == (getAdapter().getCount() - 1));
  440. if (mOverscrollEffect.isOverscrolling() && isFirstOrLast)
  441. {
  442. final float dx = getWidth() / 2;
  443. final int dy = getHeight() / 2;
  444. t.getMatrix().reset();
  445. final float translateZ = (float) (mOverscrollTranslation * Math.sin(Math.PI
  446. * Math.abs(mOverscrollEffect.mOverscroll)));
  447. final float degrees = 90 / mOverscrollRotation
  448. - (float) ((RADIANS * Math.acos(mOverscrollEffect.mOverscroll)) / mOverscrollRotation);
  449.  
  450. mCamera.save();
  451. mCamera.rotateY(degrees);
  452. mCamera.translate(0, 0, translateZ);
  453. mCamera.getMatrix(t.getMatrix());
  454. mCamera.restore();
  455. t.getMatrix().preTranslate(-dx, -dy);
  456. t.getMatrix().postTranslate(dx, dy);
  457.  
  458. if (mAnimateAlpha)
  459. {
  460. t.setTransformationType(Transformation.TYPE_BOTH);
  461. t.setAlpha((FloatMath.sin((float) ((1 - Math.abs(mOverscrollEffect.mOverscroll)) * Math.PI / 2))));
  462. }
  463. return true;
  464. }
  465. else if (mScrollPositionOffset > 0)
  466. {
  467.  
  468. final float dx = getWidth() / 2;
  469. final float dy = getHeight() / 2;
  470.  
  471. double degrees = 0;
  472. child.getLocalVisibleRect(mTempTect);
  473.  
  474. if (mTempTect.left >= mScrollPositionOffsetPixels)
  475. {
  476. if (mAnimateAlpha)
  477. {
  478. t.setTransformationType(Transformation.TYPE_BOTH);
  479. t.setAlpha((FloatMath.sin((float) (mScrollPositionOffset * Math.PI / 2))));
  480. }
  481. // right side
  482. degrees = (90 / mSwipeRotation) - (RADIANS * Math.acos(mScrollPositionOffset)) / mSwipeRotation;
  483. }
  484. else if (mTempTect.left == 0)
  485. {
  486. if (mAnimateAlpha)
  487. {
  488. t.setTransformationType(Transformation.TYPE_BOTH);
  489. t.setAlpha((FloatMath.sin((float) (mScrollPositionOffset * Math.PI / 2 + Math.PI / 2))));
  490. }
  491. // left side
  492. degrees = -(90 / mSwipeRotation) + (RADIANS * Math.acos(1 - mScrollPositionOffset)) / mSwipeRotation;
  493. }
  494.  
  495. final float translateZ = (mSwipeTranslation * FloatMath.sin((float) ((Math.PI) * mScrollPositionOffset)));
  496. // Log.i(DEBUG_TAG, visibleRect.left+ ", " + mScrollPositionOffsetPixels + ", degress = "+
  497. // String.format("%f.2", degrees));
  498.  
  499. t.getMatrix().reset();
  500. mCamera.save();
  501. mCamera.rotateY((float) degrees);
  502. mCamera.translate(0, 0, translateZ);
  503. mCamera.getMatrix(t.getMatrix());
  504. mCamera.restore();
  505. // pivot point is center of child
  506. t.getMatrix().preTranslate(-dx, -dy);
  507. t.getMatrix().postTranslate(dx, dy);
  508. // child.invalidate();
  509. return true;
  510. }
  511. return false;
  512. }
  513. }

2.Activity中使用ViewPager3D

  1. package com.example.pageradapterdemo;
  2.  
  3. import java.util.ArrayList;
  4.  
  5. import android.os.Bundle;
  6. import android.support.v4.app.FragmentActivity;
  7.  
  8. import com.focustech.common.widget.scrollviewpager.ViewPager3D;
  9.  
  10. public class MainActivity extends FragmentActivity
  11. {
  12.  
  13. private ViewPager3D mViewPager;
  14. private CommonFragmentAdapter mAdapter;
  15. private ArrayList<MyFragment> mList;
  16.  
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState)
  19. {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22.  
  23. initData();
  24. initView();
  25. }
  26.  
  27. private void initView()
  28. {
  29.  
  30. mViewPager = (ViewPager3D) findViewById(R.id.viewpager);
  31. mAdapter = new CommonFragmentAdapter(MainActivity.this, getSupportFragmentManager(), mList);
  32. mViewPager.setAdapter(mAdapter);
  33. }
  34.  
  35. private void initData()
  36. {
  37.  
  38. mList = new ArrayList<MyFragment>();
  39.  
  40. MyFragment layout1 = new MyFragment("One Fragment");
  41.  
  42. MyFragment layout2 = new MyFragment("Two Fragment");
  43.  
  44. MyFragment layout3 = new MyFragment("Three Fragment");
  45.  
  46. mList.add(layout1);
  47. mList.add(layout2);
  48. mList.add(layout3);
  49.  
  50. }
  51. }

3.CommonFragemntAdapter为ViewPager3D填充Fragment

  1. public class CommonFragmentAdapter extends FragmentStatePagerAdapter
  2. {
  3. private ArrayList<MyFragment> fragmentList;
  4.  
  5. public CommonFragmentAdapter(Activity activity, FragmentManager fm, ArrayList<MyFragment> fragmentList)
  6. {
  7. super(fm);
  8. this.fragmentList = fragmentList;
  9. }
  10.  
  11. @Override
  12. public Fragment getItem(int arg0)
  13. {
  14. return fragmentList.get(arg0);
  15. }
  16.  
  17. @Override
  18. public int getCount()
  19. {
  20. return fragmentList.size();
  21. }
  22.  
  23. @Override
  24. public void destroyItem(ViewGroup container, int position, Object object)
  25. {
  26. super.destroyItem(container, position, object);
  27. }
  28. }
  1.  

总结:将ViewPager3D当作一个普通的ViewPager来使用就可以。

android自己定义ViewPager之——3D效果应用的更多相关文章

  1. Android自己定义控件——3D画廊和图像矩阵

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/39932689 1.3D画廊的实现 我们知道android系统已经为我们提供好了一个 ...

  2. Android:给ViewPager添加切换效果

    原文参照开发者官网:http://developer.android.com/training/animation/screen-slide.html#viewpager 以App的引导页为例: 首先 ...

  3. 【Android 应用开发】Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题

    . 参考界面 : 携程app首页的广告栏, 使用ViewPager实现        自制页面效果图 : 源码下载地址: http://download.csdn.net/detail/han1202 ...

  4. Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题

    . 参考界面 : 携程app首页的广告栏, 使用ViewPager实现        自制页面效果图 : 源码下载地址: http://download.csdn.net/detail/han1202 ...

  5. Android Camera 3D效果

    一.概念 在Android中要想实现3D效果,第一个想到的应该就是OpenGL ES,因为在很多基础教材中几乎都提到了它.但是其使用起来还是稍微麻烦一些,而且它也主要用在游戏方面,那在应用方面有没有更 ...

  6. Android ViewPager打造3D画廊

    本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发. 网上有很多关于使用Gallery来打造3D画廊的博客,但是在关于Gallery的官方说法中表明: This cl ...

  7. Android开发之ViewPager实现多页面切换及动画效果(仿Android的Launcher效果)

    Android开发中经常会有引导页或者切换页面等效果,本文采用ViewPager结合动画效果来实现仿Launcher以及页面切换的效果.源码地址在文章最后给出下载. 效果图如下:       1.Vi ...

  8. Android为ViewPager添加切换动画——自己定义ViewPager

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/44224517 在上篇博客中,我写了一个使用属性动画为ViewPager加入切换动画 ...

  9. Android 自己定义RecyclerView 实现真正的Gallery效果

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38173061 .本文出自:[张鸿洋的博客] 上一篇博客我使用自己定义Horizo ...

随机推荐

  1. 区间DP(初步了解)

    区间动态规划问题一般都是考虑.对于每段区间,他们的最优值都 是由几段更小区间的最优值得到,是分治思想的一种应用,将一个区间 问题不断划分更小的区间直至一个元素组成的区间,枚举他们的组合  .求合并后的 ...

  2. Android的TextView使用Html来处理图片显示、字体样式、超链接等

    一.[Android实例]实现TextView里的文字有不同颜色 转eoe:http://www.eoeandroid.com/thread-4496-1-1.html import android. ...

  3. [转载]aptitude与apt-get的区别和联系

    转自 http://www.cnblogs.com/yuxc/archive/2012/08/02/2620003.html 命令 下面将要介绍的所有命令都需要sudo!使用时请将“packagena ...

  4. Sys.WebForms.PageRequestManagerParserErrorException:无法分析从服务器收到的消息

    我引起此原因的功能如下: 在aspx页面添加按钮 JS方法: function downPPT() { $("#Btn_DownPPT").click();    } <bo ...

  5. 费马小定理&欧拉定理

    在p是素数的情况下,对任意整数x都有xp≡x(mod p).这个定理被称作费马小定理其中如果x无法被p整除,我们有xp-1≡1(mod p).利用这条性质,在p是素数的情况下,就很容易求出一个数的逆元 ...

  6. 初学QML之qmlRegisterType

    qmlRegisterType 是一个可以将C++实现的类在QML中调用的,连接C++和QML的一个工具 首先来看QtAssistant的介绍 int qmlRegisterType(const ch ...

  7. 用phpMyAdmin修改mysql数据库密码

    1初始数据库密码为空. 2第一步,点击phpMyAdmin里的用户选项. 3选择root localhost用户名,点击编辑权限. 4此时会出来修改权限的页面,里面可以设置的选项还是比较多的,暂时不管 ...

  8. jdk,j2ee,j2se,j2me的概念区别

    jdk,j2ee,j2se,j2me的概念区别1.JDK是Java development toolkit,相当于是Java的库函数,是编译,运行java程序的工具包.J2EE是Java 2 ente ...

  9. 鼠标悬停移除更换class

    $("#xinl").mouseover(function()  //鼠标悬停执行函数 { $(".xl").removeClass().addClass(&q ...

  10. 深入理解 静态类和静态字段(C# 基础)

    序言 以前,总是被提醒,在编程过程中尽量少用静态变量,数据丢失什么的,今天有空,禁不住对静态变量的强烈好奇,跟我一起了解下静态家族的内幕吧. 静态类 定义 静态类与非静态类的重要区别在于静态类不能实例 ...