android中的页面卷曲动画?

android中的页面卷曲动画?,android,view,page-curl,Android,View,Page Curl,任何人都能想到为视图或布局实现卷曲效果。我找了很多关于它的东西,但我一点也不知道。我指的是以下链接 但这两个链接都只用于给图像提供效果。我尝试了harism代码,我只创建了一个布局并在显示后转换为位图。我成功了。但它不像视图那样工作。这意味着只有一个静态页面(如果超出文本大小,则没有滚动条)。 如果有任何想法,请建议我 public class CurlActivity extends Activity { private CurlView mCurlView; priva

任何人都能想到为视图或布局实现卷曲效果。我找了很多关于它的东西,但我一点也不知道。我指的是以下链接

但这两个链接都只用于给图像提供效果。我尝试了harism代码,我只创建了一个布局并在显示后转换为位图。我成功了。但它不像视图那样工作。这意味着只有一个静态页面(如果超出文本大小,则没有滚动条)。 如果有任何想法,请建议我

public class CurlActivity extends Activity {

    private CurlView mCurlView;
    private BitmapDrawable[] bmp = new BitmapDrawable[7];

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        int index = 0;
        if (getLastNonConfigurationInstance() != null) {
            index = (Integer) getLastNonConfigurationInstance();
        }
        mCurlView = (CurlView) findViewById(R.id.curl);
        mCurlView.setPageProvider(new PageProvider());
        mCurlView.setSizeChangedObserver(new SizeChangedObserver());
        mCurlView.setCurrentIndex(index);
        mCurlView.setBackgroundColor(0xFF202830);

        for (int i = 0; i < bmp.length; i++) {
            bmp[0] = (BitmapDrawable) getResources().getDrawable(
                    R.drawable.obama);
            bmp[1] = (BitmapDrawable) getResources().getDrawable(
                    R.drawable.road_rage);
            if (i < 2)
                continue;

            TextView b = new TextView(this);
            b.setLayoutParams(new LayoutParams(480, 854));
            b.setText("page " + i);
            b.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18);
            b.setTextColor(Color.BLACK);
            b.setBackgroundColor(Color.WHITE);
            bmp[i] = new BitmapDrawable(loadBitmapFromView(b));

        }

        // This is something somewhat experimental. Before uncommenting next
        // line, please see method comments in CurlView.
        // mCurlView.setEnableTouchPressure(true);
    }

    public static Bitmap loadBitmapFromView(View v) {
        Bitmap b = Bitmap.createBitmap(v.getLayoutParams().width,
                v.getLayoutParams().height, Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(b);
        v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
        v.draw(c);
        return b;
    }

    @Override
    public void onPause() {
        super.onPause();
        mCurlView.onPause();
    }

    @Override
    public void onResume() {
        super.onResume();
        mCurlView.onResume();
    }

    @Override
    public Object onRetainNonConfigurationInstance() {
        return mCurlView.getCurrentIndex();
    }

    /**
     * Bitmap provider.
     */
    private class PageProvider implements CurlView.PageProvider {

        // Bitmap resources.
        // private int[] mBitmapIds = { R.drawable.obama, R.drawable.road_rage,
        // R.drawable.taipei_101, R.drawable.world };

        @Override
        public int getPageCount() {
            return 7;
        }

        private Bitmap loadBitmap(int width, int height, int index) {
            Bitmap b = Bitmap.createBitmap(width, height,
                    Bitmap.Config.ARGB_8888);
            b.eraseColor(0xFFFFFFFF);
            Canvas c = new Canvas(b);

            Drawable d = bmp[index];
            // Drawable d = getResources().getDrawable(mBitmapIds[index]);

            int margin = 5;
            int border = 3;
            Rect r = new Rect(margin, margin, width - margin, height - margin);

            int imageWidth = r.width() - (border * 2);
            int imageHeight = imageWidth * d.getIntrinsicHeight()
                    / d.getIntrinsicWidth();
            if (imageHeight > r.height() - (border * 2)) {
                imageHeight = r.height() - (border * 2);
                imageWidth = imageHeight * d.getIntrinsicWidth()
                        / d.getIntrinsicHeight();
            }

            r.left += ((r.width() - imageWidth) / 2) - border;
            r.right = r.left + imageWidth + border + border;
            r.top += ((r.height() - imageHeight) / 2) - border;
            r.bottom = r.top + imageHeight + border + border;

            Paint p = new Paint();
            /**
             * Border Color
             */
            p.setColor(Color.RED);
            //p.setColor(0xFFC0C0C0);

            c.drawRect(r, p);
            r.left += border;
            r.right -= border;
            r.top += border;
            r.bottom -= border;

            d.setBounds(r);
            d.draw(c);

            return b;
        }

        @Override
        public void updatePage(CurlPage page, int width, int height, int index) {

            switch (index) {
            // First case is image on front side, solid colored back.
            case 0: {
                Bitmap front = loadBitmap(width, height, 0);
                page.setTexture(front, CurlPage.SIDE_FRONT);
                page.setColor(Color.rgb(180, 180, 180), CurlPage.SIDE_BACK);
                break;
            }
            // Second case is image on back side, solid colored front.
            case 1: {
                Bitmap back = loadBitmap(width, height, 2);
                page.setTexture(back, CurlPage.SIDE_BACK);
                page.setColor(Color.CYAN, CurlPage.SIDE_FRONT);
                break;
            }
            // Third case is images on both sides.
            case 2: {
                Bitmap front = loadBitmap(width, height, 1);
                Bitmap back = loadBitmap(width, height, 3);
                page.setTexture(front, CurlPage.SIDE_FRONT);
                page.setTexture(back, CurlPage.SIDE_BACK);
                break;
            }
            // Fourth case is images on both sides - plus they are blend against
            // separate colors.
            case 3: {
                Bitmap front = loadBitmap(width, height, 2);
                Bitmap back = loadBitmap(width, height, 1);
                page.setTexture(front, CurlPage.SIDE_FRONT);
                page.setTexture(back, CurlPage.SIDE_BACK);
                page.setColor(Color.argb(127, 170, 130, 255),
                        CurlPage.SIDE_FRONT);
                page.setColor(Color.WHITE, CurlPage.SIDE_BACK);
                break;
            }
            // Fifth case is same image is assigned to front and back. In this
            // scenario only one texture is used and shared for both sides.
            case 4:
                Bitmap front = loadBitmap(width, height, 0);
                page.setTexture(front, CurlPage.SIDE_BOTH);
                page.setColor(Color.argb(127, 255, 255, 255),
                        CurlPage.SIDE_BACK);
                break;
            }
        }

    }

    /**
     * CurlView size changed observer.
     */
    private class SizeChangedObserver implements CurlView.SizeChangedObserver {
        @Override
        public void onSizeChanged(int w, int h) {
            if (w > h) {
                mCurlView.setViewMode(CurlView.SHOW_TWO_PAGES);
                mCurlView.setMargins(.1f, .05f, .1f, .05f);
            } else {
                mCurlView.setViewMode(CurlView.SHOW_ONE_PAGE);
                mCurlView.setMargins(.1f, .1f, .1f, .1f);
            }
        }
    }

}
公共类活动扩展活动{
私有卷视图mCurlView;
私有BitmapDrawable[]bmp=新的BitmapDrawable[7];
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
int指数=0;
如果(getLastNonConfigurationInstance()!=null){
索引=(整数)GetLastNonConfiguration实例();
}
mCurlView=(CurlView)findviewbyd(R.id.curl);
setPageProvider(新的PageProvider());
mCurlView.setSizeChangedObserver(新的SizeChangedObserver());
mCurlView.setCurrentIndex(索引);
mCurlView.setBackgroundColor(0xFF202830);
对于(int i=0;ir.高度()-(边框*2)){
图像高度=r.高度()-(边框*2);
imageWidth=imageHeight*d.getIntrinsicWidth()
/d.getIntrinsicHeight();
}
r、 左+=((r.width()-imageWidth)/2)-边框;
r、 右=右+图像宽度+边框+边框;
r、 顶部+=((r.高度()-图像高度)/2)-边框;
r、 底部=r.顶部+图像高度+边框+边框;
油漆p=新油漆();
/**
*边框颜色
*/
p、 setColor(Color.RED);
//p、 设置颜色(0xFFC0);
c、 drawRect(r,p);
r、 左+=边框;
r、 右-=边界;
r、 顶部+=边框;
r、 底部-=边框;
d、 立根(r);
d、 抽签(c);
返回b;
}
@凌驾
公共void updatePage(页面卷曲、整型宽度、整型高度、整型索引){
开关(索引){
//第一种情况是正面图像,背面为纯色。
案例0:{
前位图=加载位图(宽度、高度、0);
页面设置结构(正面、卷曲页面、侧面和正面);
page.setColor(Color.rgb(180、180、180),CurlPage.SIDE_BACK);
打破
}
//第二种情况是图像背面,纯色正面。
案例1:{
位图返回=加载位图(宽度、高度,2);
页面设置结构(背面、卷曲页面、背面);
page.setColor(Color.CYAN,CurlPage.SIDE_-FRONT);
打破
}
//第三种情况是两侧的图像。
案例2:{
前位图=加载位图(宽度、高度、1);
位图返回=加载位图(宽度、高度、3);
页面设置结构(正面、卷曲页面、侧面和正面);
页面设置结构(背面、卷曲页面、背面);
打破
}
//第四种情况是两边的图像——加上它们是混合在一起的
//不同的颜色。
案例3:{