Launcher 桌面的3D转屏效果实现(2)- Camera rotate
来源:互联网 发布:淘宝卖家手机旺旺 编辑:程序博客网 时间:2024/06/15 18:31
上篇主要是通过人工方式给出所要变形的matrix,而这篇则借助于camera进行变换得到matrix直接应用到cellLayout中去,不多说了直接代码带解释
转载请注明http://ishelf.iteye.com/admin/blogs/836955
- @Override
- public void dispatchDraw(Canvas canvas) {
- long start_time = System.currentTimeMillis();
- startRotate(canvas, currentX, canvas.getWidth(), canvas.getHeight());
- super.dispatchDraw(canvas);
- canvas.restore();
- long end_time = System.currentTimeMillis();
- Log.d("CellLayout" + currentScrenn, (end_time - start_time) + " ms");
- }
- public void startRotate(Canvas mCanvas, float xCor, int width, int height) {
- boolean flag = true;
- if (isCurrentScrenn && xCor < 0) {
- xCor = width + xCor;
- flag = false;
- } else if (isCurrentScrenn && xCor >= 0) {
- // xCor = width - xCor;
- } else if (!isCurrentScrenn && xCor < 0) {
- xCor = width + xCor;
- } else if (!isCurrentScrenn && xCor >= 0) {
- flag = false;
- }
- if (xCor <= 0) {
- xCor = 10;
- }// the maximum left
- if (xCor > width) {
- xCor = width - 10;
- }// the maximum right
- float angle = 0;
- if (isBorder) {
- doDraw(mCanvas, width, height, angle, xCor);
- } else if (!flag) {
- angle = 90.0f - (xCor / (float) width) * 90.0f;
- doDraw(mCanvas, width, height, angle, xCor);
- } else {
- angle = -(xCor / (float) width) * 90.00f;
- doDraw(mCanvas, width, height, angle, xCor);
- }
- }
- private void doDraw(Canvas canvas, float width, float height, float angle, float cor) {
- canvas.save();
- mCamera.save();
- mCamera.rotateY(angle);
- mCamera.getMatrix(mMatrix);
- mCamera.restore();
- // Log.w("CellLayout" + currentScrenn, angle + " __ " + mMatrix);
- if (angle < 0) {
- mMatrix.preTranslate(-width, -height * 0.5f);
- mMatrix.postTranslate(width, height * 0.5f);
- } else {
- mMatrix.preTranslate(0f, -height * 0.5f);
- mMatrix.postTranslate(0f, height * 0.5f);
- }
- canvas.concat(mMatrix);
- switch (currentScrenn) {
- case 0:
- mPaint.setColor(Color.RED);
- break;
- case 1:
- mPaint.setColor(Color.BLUE);
- break;
- case 2:
- mPaint.setColor(Color.YELLOW);
- break;
- case 3:
- mPaint.setColor(Color.CYAN);
- break;
- case 4:
- mPaint.setColor(Color.GREEN);
- break;
- }
- mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
- canvas.drawRect(0, 0, width, height, mPaint);
- }
workspace的变化如上篇一样,这里就是引进了一个camera通过它进行变换绕Y轴的旋转变换并得到其matrix就可以了。camera使用了opengl的变化操作,所要控制效果要比人为控制matrix好些,但总体显示效果差不多。
从效率上将,如果机器支持3D加速,其速度要比2D快,不过差别也不是很大,本文做了以下一个比较
- log-0-2D.txt 18.291666
- log-0-3D.txt 7.9088144
- log-1-2D.txt 22.92562
- log-1-3D.txt 22.818924
- log-2-2D.txt 29.503529
- log-2-3D.txt 27.178694
每一行的数值表示canvas画图的时间,单位为毫秒,测试数据的平均执行次数在1000次左右,文件名中的0表示第1屏,2表示第二屏。从上面的数据可以看出,基本上相差不大,人工基本上感觉不出来。之所以第一屏差距有些大可能是因为第一屏有左边界。补充下测试的机器是真机, 大家以后来去数码市场悄悄 O(∩_∩)O哈哈~
以上只是demo,供以学习和讨论。欢迎大家给以指正
- Launcher 桌面的3D转屏效果实现(2)- Camera rotate
- Launcher 桌面的3D转屏效果实现(1)-matrix setPolyToPoly
- Launcher 桌面3D效果实现切屏
- 分享:通过Launcher里的WorkSpace完成桌面的3D转屏效果(有源码)
- 通过Launcher里的WorkSpace完成桌面的3D转屏效果
- 通过Launcher里的WorkSpace完成桌面的3D转屏效果(有源码)
- 分享:通过Launcher里的WorkSpace完成桌面的3D转屏效果(有源码)
- android.graphics.Camera 实现简单的3D效果
- android camera 实现3d效果
- Camera实现3D翻转效果
- Android Launcher桌面3D实现和原理分析
- Fedora9下3D桌面效果的实现
- Camera 3D旋转效果
- Android Camera 3D效果
- Android Camera 3D效果
- Android Camera 3D效果
- Android Camera 3D效果
- android 用camera实现3D效果
- 多线程的概念
- 关于supesite后台添加外部链接后字符转义的问题
- 排序算法
- 数据库导入txt文件(不含sql语句)
- SQLMAP注入拖库过程
- Launcher 桌面的3D转屏效果实现(2)- Camera rotate
- html5 车展
- 设计包含min函数的栈 java实现
- android 耗电量
- jQuery选择器大全
- VS开发php
- admin10000
- 程序员如何保持优秀
- 传递文件描述符