您的位置:首页 > 其它

给一个页面进行变形实现魔法的一面变形----之变形

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。问别人。查资料。确定思路,验证,可以通过,不行则继续寻找思路。

总结起来就是下面的方法:

大胆假设、小心求证。

求真务实、锲而不舍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐