该控件大致实现方法:
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的画布中。


我们在来看看xml代码:


java代码:
main.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!--
广告创意放置的位置。
此处我放在Activity最顶部
-->
<!-- 广告位设置开始 -->
<com.adsame.mai.AdsameMob
android:layout_height="100dp"
android:layout_width="fill_parent"
android:id="@+id/adsameMobId"/>
<!-- 广告位设置结束 -->
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
</LinearLayout>








<!-- 广告位设置结束 --><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"</LinearLayout>






page.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="20dip"
android:background="#FFFFDD">
<ImageView android:layout_width="fill_parent" android:id="@+id/book_img"
android:layout_height="fill_parent" android:layout_weight="1"
android:scaleType="fitXY" android:src="@drawable/p1"/>
<com.book.TelEdit
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"/>
</LinearLayout>


控件TelEdit.java代码:java代码:
package eoe.book;


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.WindowManager;
import android.widget.EditText;


public class TelEdit extends EditText {
Context mContext;
public TelEdit(Context context) {
super(context);
mContext = context;
}


public TelEdit(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
}


public TelEdit(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = context;
}


protected void onDraw(Canvas canvas) {
WindowManager wm = (WindowManager) mContext.getSystemService("window");
int windowWidth = wm.getDefaultDisplay().getWidth();
int windowHeight = wm.getDefaultDisplay().getHeight();
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.BLACK);




int paddingTop = getPaddingTop();
int paddingBottom = getPaddingBottom();
int scrollY = getScrollY();
int scrollX = getScrollX() + windowWidth;
int innerHeight = scrollY + getHeight() - paddingBottom;
int lineHeight = getLineHeight();
int baseLine = scrollY+ (lineHeight - ((scrollY - paddingTop) % lineHeight));
int x = 8;




while (baseLine < innerHeight) {
canvas.drawLine(x, baseLine, scrollX - x, baseLine, paint);
baseLine += lineHeight;
}
super.onDraw(canvas);
}


}




eBook.java文件部分代码:


java代码:
package eoe.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<Integer> 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);
}


}

更多相关文章

  1. 如何在Android(安卓)TV 桌面添加自定义频道/节目
  2. Android(安卓)判断网络连接
  3. Android(安卓)studio 快捷键大全
  4. 使用Jenkins进行Android自动打包及SonarQube代码自动检测
  5. 【Android基础入门No.3】AndroidのListFragment
  6. Android(安卓)Studio V3.12环境下TV开发教程(十)添加引导步骤
  7. "Kernel version" 中编译时间的前世今生
  8. Android用代码测试Activity的生命周期
  9. Dex2Oat源码流程(1)——Android6.0

随机推荐

  1. sql 数据库出现“只读”提示 解决方法 (s
  2. sql存储过程几个简单例子
  3. 实例理解SQL中truncate和delete的区别
  4. SQL Server中NULL的正确使用与空间占用
  5. SQLSERVER分页查询关于使用Top方式和row_
  6. SQL中print、sp_helptext的限制与扩展
  7. Android(安卓)Studio Gradle多渠道打包
  8. android中异步任务AsyncTask的应用和工作
  9. Android(安卓)中自定义权限
  10. Android联系人数据库全解析(1)