给一个页面进行变形实现魔法的一面变形----之变形
2011-07-27 18:39
232 查看
1.protected void dispatchDraw(Canvas canvas) {
final long drawingTime = getDrawingTime();
final int count = getChildCount();
for (int i = 0; i < count; i++) {
drawScreen(canvas, i, drawingTime);
}
}
2.
public void drawScreen(Canvas canvas, int screen, long drawingTime) {
Log.d(tag, "==================================screen = "+screen);
final int width = getWidth();
final int scrollWidth = screen * width;
final int scrollX = getScrollX();
// if screen can not look by user ,don't show
if(scrollWidth > scrollX + width || scrollWidth + width < scrollX){
return ;
}
final View child = getChildAt(screen);
/**
* 计算每页偏转的角度
*/
final int faceIndex = screen;
final float currentDegree = getScrollX() * (angle / getMeasuredWidth());
Log.d(tag, "getScrollX() = " + getScrollX() + " getMeasuredWidth() = " + getMeasuredWidth());
Log.d(tag, "currentDegree = " + currentDegree);
final float faceDegree = currentDegree - faceIndex *angle;
Log.d(tag, "faceDegree = " + faceDegree);
if(faceDegree > 90 || faceDegree < -90){
return ;
}
// 以两个屏幕相交的线的中点为中线进行旋转
final float centerX = (scrollWidth < scrollX) ? scrollWidth + width : scrollWidth ;
final float centerY = getHeight() / 2;
Log.d(tag, "centerX = " + centerX + ", centerY = " + centerY);
final Camera camera = mCamera;
final Matrix matrix = mMatrix;
canvas.save();
camera.save();
camera.rotateY(-faceDegree);
camera.getMatrix(matrix);
camera.restore();
// 移动到(centerX,cneterY)
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
canvas.concat(matrix);
Log.d(tag, "---------------------------------------getIsScrolling() = " + getIsScrolling());
drawChild(canvas, child, drawingTime);
canvas.restore();
}
3.修改比较卡得操作
setChildrenDrawingCacheEnabled(true);
setChildrenDrawnWithCacheEnabled(true);
4. ??? 实验用两个固定的图片直接draw,应该是在(0,0)位置显示,效果应该相同。但显示却跟我预想的不一样。这个问题留下来。
我是如何解决的:查资料,跟别人提问。猜想,实验,不行重新分析。setPolyToPoly 、gl、又回到Matrix。问别人。查资料。确定思路,验证,可以通过,不行则继续寻找思路。
总结起来就是下面的方法:
大胆假设、小心求证。
求真务实、锲而不舍。
final long drawingTime = getDrawingTime();
final int count = getChildCount();
for (int i = 0; i < count; i++) {
drawScreen(canvas, i, drawingTime);
}
}
2.
public void drawScreen(Canvas canvas, int screen, long drawingTime) {
Log.d(tag, "==================================screen = "+screen);
final int width = getWidth();
final int scrollWidth = screen * width;
final int scrollX = getScrollX();
// if screen can not look by user ,don't show
if(scrollWidth > scrollX + width || scrollWidth + width < scrollX){
return ;
}
final View child = getChildAt(screen);
/**
* 计算每页偏转的角度
*/
final int faceIndex = screen;
final float currentDegree = getScrollX() * (angle / getMeasuredWidth());
Log.d(tag, "getScrollX() = " + getScrollX() + " getMeasuredWidth() = " + getMeasuredWidth());
Log.d(tag, "currentDegree = " + currentDegree);
final float faceDegree = currentDegree - faceIndex *angle;
Log.d(tag, "faceDegree = " + faceDegree);
if(faceDegree > 90 || faceDegree < -90){
return ;
}
// 以两个屏幕相交的线的中点为中线进行旋转
final float centerX = (scrollWidth < scrollX) ? scrollWidth + width : scrollWidth ;
final float centerY = getHeight() / 2;
Log.d(tag, "centerX = " + centerX + ", centerY = " + centerY);
final Camera camera = mCamera;
final Matrix matrix = mMatrix;
canvas.save();
camera.save();
camera.rotateY(-faceDegree);
camera.getMatrix(matrix);
camera.restore();
// 移动到(centerX,cneterY)
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
canvas.concat(matrix);
Log.d(tag, "---------------------------------------getIsScrolling() = " + getIsScrolling());
drawChild(canvas, child, drawingTime);
canvas.restore();
}
3.修改比较卡得操作
setChildrenDrawingCacheEnabled(true);
setChildrenDrawnWithCacheEnabled(true);
4. ??? 实验用两个固定的图片直接draw,应该是在(0,0)位置显示,效果应该相同。但显示却跟我预想的不一样。这个问题留下来。
我是如何解决的:查资料,跟别人提问。猜想,实验,不行重新分析。setPolyToPoly 、gl、又回到Matrix。问别人。查资料。确定思路,验证,可以通过,不行则继续寻找思路。
总结起来就是下面的方法:
大胆假设、小心求证。
求真务实、锲而不舍。
相关文章推荐
- 给一个页面进行变形实现魔法的一面变形
- 给一个页面进行变形实现魔法的一面变形----之将View替换成ImageView
- 如何用js实现,在一个页面有个输入文档框,然后点击查询按扭后,调用IE的查询功能在当前页面进行查询
- 如何通过JQ,Ajax来实现返回到上一个页面并进行刷新
- 使用一个Activity进行所有界面的显示,观察者模式实现标题与底部根据中间页面的改变而改变
- H5页面实现一个Audio标签加载多个音频文件,并进行播放和展示音频长度
- 对Guava Cache的封装和使用(包括一个管理页面实现了查看统计信息、情况、查看记录等)
- 一个页面多个超连接的实现
- 使用java的html解析器jsoup和jQuery实现一个自动重复抓取任意网站页面指定元素的web应用
- 解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
- 一个提供 在timestamp和date之间 进行转换功能的页面 http://www.timestampconvert.com/
- 基于Metronic的Bootstrap开发框架经验总结(13)--页面链接收藏夹功能的实现2(利用Sortable进行拖动排序)
- 使用Olami SDK实现一个语音输入数字进行24点计算的iOS程序
- 同一个表单 根据要求递交到不同页面的实现方法小结
- 使用MATLAB中的HDL coder工具箱,对一个线性调频信号进行FIR滤波,最终在FPGA上实现
- 用JQUERY实现给当前页面导航一个CSS
- 制作一个页面网格,可以用来把自己所做的UI和需求图片进行位置,像素比较
- asp.net 参数不同共用一个页面的实现方法
- 有了html页面,进行二次显示,通过html、JavaScript、jQuery的ajax三种技术,我可以实现任何界面效果
- js:页面多处输入只使用一个验证码/获得焦点显示/onblur隐藏实现