最近看到flipboard的翻页效果很不错,就想着把他给实现,整个效果做的差不多了,还有一些细节要完善,现在放上来。我学android全靠自学的,而且的代码的质量也难保证,还希望各位大神批评指正那。

核心源码放一部分,我顺便到github上那个开源工程去。哈哈。

主要利用的原理还是通过拉伸图片实现类似三维沿着Y轴方向翻转的效果,

我说下我的原理,假如一张图片,如图1,我对他进行宽度拉伸,和高度压缩,图片看起来,就好像是沿坐标轴Y轴翻转了一样,

实现这个效果,在加上适当的光效,就可以很好的模拟了。整个的效果,我主要仿着flipboar我主要是用了

google的apidemos里面的PolyToPoly里面的方法,通过控制四个点的位置,来实现。主要用的方法就

是matrix.setPloyToPloy()。

package com.iobee.ui;import java.util.Timer;
import java.util.TimerTask;import com.iobee.activity.R;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.Path;
import android.graphics.Region;
import android.graphics.drawable.GradientDrawable;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;/*** 采用src更改点的位置,进行拉升类实现3d翻转效果。* @author iobee**/
public class flipboardviewSrc extends View{private final static String TAG = "flipboardViewSrc";//当开始翻转时,激发翻转程序,生成翻转效果用的上下两张bitmapprivate Bitmap downBitmap;private Bitmap upBitmap;private Bitmap currentBitmap;private Bitmap bitmap;private Bitmap grayBitmap;//对翻转时需要进行设置的一些类private Matrix UpMatrix; //矩阵private Matrix DownMatrix;private Paint paint; //绘制bitmap时的一些属性设计private Paint paintGray;private Canvas canvas; //画布private Path path;//翻转时,需要固定的一些点private int centerX,centerY;private int mscreenY,mscreenX; //当前手机屏幕的宽和高private float deltaX,deltaY;private float firstX,firstY;private int testY;//shadowprivate int[] gradientShadow;private GradientDrawable gradientdrawable;private ColorMatrix colormatrix;//private float[] src = {0,480,640,480,60,960,580,960};//private float[] dst = {0,480,640,480,5,560,640,560};private float baseY = 0;private int UpOrDown; //判断是上翻还是下翻private Timer time;public flipboardviewSrc(Context context) {super(context);// TODO Auto-generated constructor stubcreatBitmap();initCanvas();}/*** 生成bitmap*/public void creatBitmap(){upBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.background_right);downBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg_960_640);grayBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.mask_gray);currentBitmap =    BitmapFactory.decodeResource(getResources(), R.drawable.test2);bitmap = currentBitmap;}/*** 初始化画布绘制的一些数据*/public void initCanvas(){mscreenX = 480;mscreenY = 854;centerX = mscreenX/2;centerY = mscreenY/2;paint = new Paint();paint.setAntiAlias(true);paintGray = new Paint();paintGray.setAntiAlias(true);paintGray.setAlpha(0);//src = new Float[]{0,480};UpMatrix = new Matrix();DownMatrix = new Matrix();colormatrix = new ColorMatrix();colormatrix.set(new float[] {1, 0, 0, 0, 0,0, 1, 0, 0, 0,0, 0, 1, 0, 0,0, 0, 0, 1, 0 });//paint.setColorFilter(new ColorMatrixColorFilter(colormatrix));gradientShadow = new int[]{0xFF000000,0xFF000000};gradientdrawable = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, gradientShadow);gradientdrawable.setGradientType(GradientDrawable.LINEAR_GRADIENT);//设置矩形path,分隔图片用path = new Path();path.moveTo(0, 0);path.lineTo(mscreenX, 0);path.lineTo(mscreenX,centerY);path.lineTo(0, centerY);path.close();}/*** 自动翻转* @param delta*/public void autoUpdate(){        time = new Timer();TimerTask task = new TimerTask() {         @Overridepublic void run() {// TODO Auto-generated method stubif(Math.abs(testY) < mscreenY){if(UpOrDown == 1)testY += 10;else if(UpOrDown == 2)testY -=10;Log.i(TAG, "testY-->"+testY);taskManager(testY);}elsetime.cancel();}};      time.schedule(task, 0, 10);}/*** 对用户操作行为进行分析并作出相应行为反馈*/public void taskManager(float deltaY){float multiple,currentY = 0,currentX = 0,initY;int currentAlpha = 0;if(UpOrDown == 0)if(deltaY >0)UpOrDown = 1;else if(deltaY <0)UpOrDown = 2;if(UpOrDown == 1){ //如果下翻,计算Y点的坐标和X点坐标multiple = (mscreenY - baseY)/(firstY - baseY); //获取初始距离的倍数,用来计算Y方向到哪里currentY = mscreenY - deltaY*multiple;if(currentY > mscreenY)currentY = mscreenY;if(currentY < 0)currentY = 0;}else if(UpOrDown == 2 ){ multiple = (mscreenY - baseY)/(mscreenY-baseY-firstY);if(deltaY > 0)deltaY = 0;            currentY = Math.abs(deltaY)*multiple;if(currentY > mscreenY)currentY = mscreenY;Log.i(TAG, "currentY-->"+currentY);}//如果Y点在下半个屏幕if(currentY > centerY){initY = mscreenY;if(UpOrDown == 1)bitmap = currentBitmap;else if(UpOrDown == 2)bitmap = upBitmap;currentX = (currentY - centerY)/7;currentAlpha = (int) ((mscreenY - currentY)/2);gradientdrawable.setBounds(0, centerY, mscreenX, mscreenY);}else{ //如果Y点在上半个屏幕initY = 0;if(UpOrDown == 1)bitmap = downBitmap;else if(UpOrDown == 2)bitmap = currentBitmap;currentX = (centerY - currentY)/7;currentAlpha = (int) (currentY/2);gradientdrawable.setBounds(0, 0, mscreenX, centerY);}float[] dst = {0,centerY,mscreenX,centerY,currentX,currentY,mscreenX-currentX,currentY};float[] src = {0,centerY,mscreenX,centerY,61,initY,mscreenX-61,initY};UpMatrix.setPolyToPoly(src, 0, dst, 0, src.length>>1);//设置透明度//int currentAlpha = (int) ((960 - currentY)/2);paintGray.setAlpha(currentAlpha);gradientdrawable.setAlpha(255 - currentAlpha);postInvalidate();    }public void updateView(Canvas canvas){if(UpOrDown == 1 || UpOrDown ==0){canvas.save();canvas.clipPath(path,Region.Op.DIFFERENCE);              canvas.drawBitmap(downBitmap, DownMatrix, paint);if(bitmap == currentBitmap){gradientdrawable.draw(canvas);canvas.drawBitmap(bitmap, UpMatrix, paint);canvas.drawBitmap(grayBitmap, UpMatrix, paintGray);}canvas.restore();canvas.save();canvas.clipPath(path,Region.Op.INTERSECT);canvas.drawBitmap(currentBitmap, DownMatrix, paint);if(bitmap == downBitmap){gradientdrawable.draw(canvas);canvas.drawBitmap(bitmap, UpMatrix, paint);canvas.drawBitmap(grayBitmap, DownMatrix, paintGray);}canvas.restore();}if(UpOrDown == 2){canvas.save();canvas.clipPath(path,Region.Op.DIFFERENCE);              canvas.drawBitmap(currentBitmap, DownMatrix, paint);if(bitmap == upBitmap){gradientdrawable.draw(canvas);canvas.drawBitmap(bitmap, UpMatrix, paint);canvas.drawBitmap(grayBitmap, UpMatrix, paintGray);}canvas.restore();canvas.save();canvas.clipPath(path,Region.Op.INTERSECT);canvas.drawBitmap(upBitmap, DownMatrix, paint);if(bitmap == currentBitmap){gradientdrawable.draw(canvas);canvas.drawBitmap(bitmap, UpMatrix, paint);canvas.drawBitmap(grayBitmap, UpMatrix, paintGray);}canvas.restore();}}@Overrideprotected void dispatchDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.dispatchDraw(canvas);canvas.drawColor(Color.YELLOW);canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));updateView(canvas);       }@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubLog.i(TAG, "ontouchevent");float mLastMotionX = event.getX();float mLastMotionY = event.getY();Log.i(TAG, "mLastMotionY-->"+mLastMotionY);Log.i(TAG, "firstY-->"+firstY);switch (event.getAction()) {case MotionEvent.ACTION_DOWN:Log.i(TAG, "action_down");firstY = mLastMotionY;UpOrDown = 0;break;case MotionEvent.ACTION_MOVE:Log.i(TAG, "action_move");deltaY = firstY - mLastMotionY;Log.i(TAG, deltaY+"");taskManager(deltaY);break;case MotionEvent.ACTION_UP:Log.i(TAG, "event.up");testY = (int) deltaY;autoUpdate();//taskManager(0);break;default:break;}return true;}}
最近看到flipboard的翻页效果很不错,就想着把他给实现,整个效果做的差不多了,还有一些细节要完善,现在放上来。我学android全靠自学的,而且的代码的质量也难保证,还希望各位大神批评指正那。我把工程文件上传到了 http://download.csdn.net/detail/iobee/4388778这个csdn了。大家可以去下载哦。

flipboard的翻页效果的实现相关推荐

  1. 教你仿写 Flipboard 的翻页效果

    前言 自从清明放假之后,状态就一直一般般,(放假使我快乐,不要上学,我要放假!)导致更文也断了一段时间,鸽了好一段时间.痛定思痛,最近决定重新恢复更文.鉴于前段时间在学习扔物线大大 HenCoder ...

  2. Android之实现上下左右翻页效果

    如果实现上下或者左右翻页效果,我们借助下这个开源项目:https://github.com/openaphid/android-flip Aphid FlipView是一个能够实现Flipboard翻 ...

  3. 关于Page翻页效果--Page View Controller

    Page View Controllers 你使用一个page view controller用page by page的方式来展示内容.一个page view controller管理一个self- ...

  4. 微信小程序实现滑动翻页效果源码附效果图

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 正文: 微信小程序实现滑动翻页效果 效果图: 源码: <view class="mainFra ...

  5. javascript移动端 电子书 翻页效果

    1.后端给一长串的纯文本 2.前端根据屏幕的高度,将文本切割为 n 页 3.使用插件 turn.js 将切割好的每页,加上翻书效果 <!DOCTYPE html> <html lan ...

  6. 用AjaxPro实现无刷新翻页效果及数据库分页技术介绍

    在看本文之前,建议查看本人的系列文章: <AjaxPro与服务器端交互过程中如何传值>:http://blog.csdn.net/zhoufoxcn/archive/2008/01/05/ ...

  7. php左右滑动翻页代码,C#_NGUI实现滑动翻页效果实例代码,废话不多说了,直接给大家上 - phpStudy...

    NGUI实现滑动翻页效果实例代码 废话不多说了,直接给大家上干货了. 具体代码如下所示: using UnityEngine; using System.Collections; public cla ...

  8. ViewPager实现滑动翻页效果

    实现ViewPager的滑动翻页效果可以使用ViewPager的setPageTransformer方法,如下: import android.content.Context; import andr ...

  9. ViewPager实现翻页效果导航点

    ViewPager实现翻页效果&导航点 代码下载:https://jww.lanzous.com/i37TMos71uf or: https://download.csdn.net/downl ...

最新文章

  1. mybatisgenerator使用_MyBatis Generator,帮你少写50%代码的自动化工具,你用过吗?
  2. linux 卸载 flash,使用率下降到8%,Chrome 87将完全移除Flash
  3. android三种载入图片方式
  4. 基于 Go 的内置 Parser 打造轻量级规则引擎
  5. java short 后缀_自学java的新手问个问题,为什么写个代码中的int能自动转
  6. 关于TCP协议的大部分,面试常问的几点都在这理里了
  7. [MySQL] InnoDB三大特性之 - 插入缓冲
  8. vim使用指北 ---- Global Replacement
  9. 关于easyui遇到的一些问题
  10. Deconvolutional Networks论文解读
  11. ITIL4定义的四大价值维度
  12. matlab节约里程法_vrp几种算法的matlab源代码(扫描算法,禁忌搜索算法,节约里程算法)...
  13. 易语言高级表格如何右击选择当前项,再弹出右击菜单?
  14. VB/VBA之死,何时休?
  15. 3.4 网页开发工具
  16. 阿里云网关签名特殊字符无法通过
  17. 我裁完兄弟后,辞职了,转行做了一名小职员
  18. const int *,const int * const和int const *之间的区别
  19. 【npm 报错 gyp info it worked if it ends with ok 大概率是包版本问题】
  20. matlab仿真环境运行,ADMIRE 飞行仿真模型,Matlab环境中运行,可实现快速 ,性能分析 274万源代码下载- www.pudn.com...

热门文章

  1. mall-swarm微服务商城系统
  2. Visual Studio 6.0下载地址
  3. SQLite使用模糊查询
  4. vim 编辑器 不小心点了crtl+s 终端停止输出问题
  5. wince6.0 屏幕旋转
  6. 112、Flutter实现图片放大缩小的动画小
  7. 企业微信开发(自建应用h5)
  8. PyTorch(13)---优化器_随机梯度下降法
  9. 解决黑苹果核显开机屏幕暗等3-5分钟才完全亮的问题
  10. RealSense D435 在ROS kinetic 下的配置