android+ebook控件,Android 自定义控件 eBook 翻书效果

Android 自定义控件 eBook 翻书效果

效果图:

QQ%E6%88%AA%E5%9B%BE20130224164030.png

Book.java文件:

package com.book;import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.ImageView;public class Book extends Activity {

/** Called when the activity is first created. */

eBook mBook;

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

mBook = (eBook)findViewById(R.id.my_book);

mBook.addLayoutRecForPage(R.layout.page,21);

mBook.setListener(new eBook.Listener() {

public void onPrevPage() {

updateContent();

}

public void onNextPage() {

updateContent();

}

public void onInit() {

updateContent();

}

});

}

private void updateContent(){

int index = mBook.getIndexForLeftPage();

View left = mBook.getLeftPage(),right = mBook.getRightPage();

View next1 = mBook.getNextPage1(),next2 = mBook.getNextPage2();

View prev1 = mBook.getPrevPage1(),prev2 = mBook.getPrevPage2();

if(left != null)setImg(left,index);

if(right != null)setImg(right,index+1);

if(next1 != null)setImg(next1,index+2);

if(next2 != null)setImg(next2,index+3);

if(prev1 != null)setImg(prev1,index-1);

if(prev2 != null)setImg(prev2,index-2);

mBook.invalidate();

}

private void setImg(View v , int index){

if(index >= 0 && index < 20){

ImageView img = (ImageView)v.findViewById(R.id.book_img);

if(img == null)return;

Log.d("eBook","set Img");

switch(index%6){

case 0:

img.setImageResource(R.drawable.p1);

break;

case 1:

img.setImageResource(R.drawable.p2);

break;

case 2:

img.setImageResource(R.drawable.p3);

break;

case 3:

img.setImageResource(R.drawable.p4);

break;

case 4:

img.setImageResource(R.drawable.p5);

break;

case 5:

img.setImageResource(R.drawable.p6);

break;

default:

break;

}

}

}

}main.xml文件:<?xml version="1.0" encoding="utf-8"?>

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

android:layout_width="fill_parent"

android:layout_height="fill_parent"/>

page.xml文件:<?xml version="1.0" encoding="utf-8"?>

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:padding="20dip"

android:background="#FFFFDD">

android:layout_height="fill_parent" android:layout_weight="1"

android:scaleType="fitXY" android:src="@drawable/p1"/>

android:id="@+id/book_text"

android:layout_width="fill_parent"

android:background="#ffffdd"

android:gravity="top"

android:typeface="sans"

android:capitalize="sentences"

android:lineSpacingExtra="5dip"

android:textSize="15dip"

android:textColor="#000000"

android:layout_height="fill_parent"

android:paddingTop="30dip"

android:layout_weight="1"/>

eBook.java文件部分代码:package com.book;import java.util.ArrayList;

import java.util.Date;

import java.util.List;import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.LinearGradient;

import android.graphics.Paint;

import android.graphics.Path;

import android.graphics.Point;

import android.graphics.PorterDuffXfermode;

import android.graphics.Shader;

import android.graphics.PorterDuff.Mode;

import android.util.AttributeSet;

import android.util.Log;

import android.view.GestureDetector;

import android.view.LayoutInflater;

import android.view.MotionEvent;

import android.view.View;

import android.view.GestureDetector.OnGestureListener;

import android.widget.FrameLayout;

import android.widget.LinearLayout;public class eBook extends FrameLayout{

public static final String LOG_TAG = "eBook";

List myRecPages;

int totalPageNum;

Context mContext;

boolean hasInit = false;

final int defaultWidth = 600 , defaultHeight = 400;

int contentWidth = 0;

int contentHeight = 0;

View leftPage,rightPage,llPage,lrPage,rrPage,rlPage;

LinearLayout mView;

bookView mBookView;

boolean closeBook = false;

private enum Corner {

LeftTop,

RightTop,

LeftBottom,

RightBottom,

None

};

private Corner mSelectCorner;

final int clickCornerLen = 250*250; //50dip

float scrollX = 0,scrollY = 0;

int indexPage = 0;

private enum State {

ABOUT_TO_ANIMATE,

ANIMATING,

ANIMATE_END,

READY,

TRACKING

};

private State mState;

private Point aniStartPos;

private Point aniStopPos;

private Date aniStartTime;

private long aniTime = 2000;

private long timeOffset = 900;

Listener mListener;

private GestureDetector mGestureDetector;

private BookOnGestureListener mGestureListener;

public eBook(Context context) {

super(context);

Init(context);

}public eBook(Context context, AttributeSet attrs) {

super(context, attrs);

Init(context);

}...省略}

该控件大致实现方法:

eBook继承FrameLayout,好处在于FrameLayout有图层效果,后添加的View类能覆盖前面的View。

初始化:定义一个LinearLayout的成员变量mView,将page.xml inflate 成View分别用leftPage,rightPage引用,并初始化其数据,将leftPage,rightPage通过addView添加到mView,然后将mView添加到eBook。在eBook里定义一个私有类BookView extends View。 并定义成员变量 BookView mBookView; 最后将mBookView添加的eBook中,这样,mView中的内容为书面内容,mBookView中的内容为特效内容。

后续手势动作:可将各种手势的特效动作画于mBookView的画布中。

效果图, 效果, Android, activity, created

翻页效果,导入源码即可运行。 package sf.hmg.turntest; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PointF; import android.graphics.Region; import android.graphics.drawable.GradientDrawable; import android.util.Log; import android.view.MotionEvent; import android.view.View; public class PageWidget extends View { private static final String TAG = "hmg"; private int mWidth = 480; private int mHeight = 800; private int mCornerX = 0; // 拖拽点对应的页脚 private int mCornerY = 0; private Path mPath0; private Path mPath1; Bitmap mCurPageBitmap = null; // 当前页 Bitmap mCurPageBackBitmap = null; Bitmap mNextPageBitmap = null; PointF mTouch = new PointF(); // 拖拽点 PointF mBezierStart1 = new PointF(); // 贝塞尔曲线起始点 PointF mBezierControl1 = new PointF(); // 贝塞尔曲线控制点 PointF mBeziervertex1 = new PointF(); // 贝塞尔曲线顶点 PointF mBezierEnd1 = new PointF(); // 贝塞尔曲线结束点 PointF mBezierStart2 = new PointF(); // 另一条贝塞尔曲线 PointF mBezierControl2 = new PointF(); PointF mBeziervertex2 = new PointF(); PointF mBezierEnd2 = new PointF(); float mMiddleX; float mMiddleY; float mDegrees; float mTouchToCornerDis; ColorMatrixColorFilter mColorMatrixFilter; Matrix mMatrix; float[] mMatrixArray = { 0, 0, 0, 0, 0, 0, 0, 0, 1.0f }; boolean mIsRTandLB; // 是否属于右上左下 // for test float mMaxLength = (float) Math.hypot(480, 800); int[] mBackShadowColors; int[] mFrontShadowColors; GradientDrawable mBackShadowDrawableLR; GradientDrawable mBackShadowDrawableRL; GradientDrawable mFolderShadowDrawableLR; GradientDrawable mFolderShadowDrawableRL; GradientDrawable mFrontShadowDrawableHBT; GradientDrawable mFrontShadowDrawableHTB; GradientDrawable mFrontShadowDrawableVLR; GradientDraw
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值