本文实例讲述了Android自定义控件eBook实现翻书效果的方法。分享给大家供大家参考,具体如下:

效果图:

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文件:

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文件:

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="http://wallage.blog.163.com/blog/@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"/>

控件TelEdit.java代码:

package com.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文件部分代码:

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程序设计有所帮助。

自定义控件android特效,Android自定义控件eBook实现翻书效果实例详解相关推荐

  1. android自定义圆角进度条,Android自定义进度条的圆角横向进度条实例详解

    1.本文将向你介绍自定义进度条的写法,比较简单,但还是有些知识点是需要注意的: invalidate()方法 RectF方法的应用 onMeasure方法的应用 2.原理 画3层圆角矩形,底层为黑色, ...

  2. android相册和拍照并裁剪图片大小,Android 拍照并对照片进行裁剪和压缩实例详解...

    Android 拍照并对照片进行裁剪和压缩实例详解 本文主要介绍 Android 调用摄像头拍照并对照片进行裁剪和压缩,文中给出了主要步骤和关键代码. 调用摄像头拍照,对拍摄照片进行裁剪,代码如下. ...

  3. android mvp模式例子_Android中mvp模式使用实例详解

    MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一 ...

  4. html局部翻页效果,基于Turn.js 实现翻书效果实例解析

    最近项目经理我个项目练练手,其项目需求是要实现翻书效果,看到这个需求后,我真是懵了,这咋整,我可是java出身的啊,这个问题真是难住我了,后来有同事的指导,之前他曾经做过PC版的翻书效果,当时使用的是 ...

  5. android饿了么购物车,Android仿饿了么加入购物车旋转控件自带闪转腾挪动画的按钮效果(实例详解)...

    概述 在上文,酷炫Path动画已经预告了,今天给大家带来的是利用 纯自定义View,实现的仿饿了么加入购物车控件,自带闪转腾挪动画的按钮. 效果图如下: 图1 项目中使用的效果,考虑到了View的回收 ...

  6. Android App开发手机阅读中实现平滑翻书效果和卷曲翻书动画实战(附源码 简单易懂 可直接使用)

    需要图片集和源码请点赞关注收藏后评论区留言~~~ 一.平滑翻书效果 与纸质书籍类似,手机上的电子书也有很多页,逐页浏览可采用翻页视图,然而翻页视图犹如一幅从左到右的绵长画卷,与现实生活中上下层叠的书籍 ...

  7. android 阅读器自动滚动,在Android手机上实现阅读器翻页效果.doc

    在Android手机上实现阅读器翻页效果 先了解各个字母表示的含义:A-把书页翻起来后看到的背面区域B-把书页翻起来后看到的下一页的一角C-当前页的可见部分.a-手指滑动页角到达的位置b-当前页翻起来 ...

  8. Android利用贝塞尔曲线实现翻书效果(适配AndroidX)

    实现背景 不知道你有没有遇到同样的问题,要实现翻书效果,如果你是使用github上的demo或者好多博客上写的方式,你会发现,当api从28开始,会抛出Invalid Region.Op.REPLAC ...

  9. android中怎么网络判断,Android中判断网络是否连接实例详解

    Android中判断网络是否连接实例详解 在android中,如何监测网络的状态呢,这个有的时候也是十分重要的,方法如下: public class ConnectionDetector { priv ...

最新文章

  1. Cisco2811基本操作
  2. 一起谈.NET技术,获取ISAPI_Rewrite重写后的URL
  3. 1049-飞机最少换乘次数问题
  4. 用函数求10个数的平均值_Excel AVERAGEIF函数条件求平均值
  5. 4.Boost之ref
  6. Mysql生成连续时间段记录
  7. 在线抓娃娃爆火之后,新玩家入局还有希望吗?
  8. 依赖注入的威力,.NET Core的魅力:解决MVC视图中的中文被html编码的问题
  9. 迪普交换机清空配置_交换机环路详解
  10. 动态规划(三)——最少硬币和所有硬币问题
  11. his提供哪些服务_论文查重检测系统提供哪些服务
  12. 中文乱码问题:JSP页面的显示问题,获取中文参数值问题
  13. 电路设计——教你如何阅读数据手册
  14. oracle 增加字段说明,oracle 增加字段
  15. 二进制加法器c语言程序,二进制加法器电路框图
  16. 多少层楼听不见街边噪音_街边刮板
  17. carLife 车机端集成
  18. Linux - 虚拟网络设备 - bridge,veth,namespace
  19. 三分钟快速了解typeScript接口
  20. 后TOS时代的码头数字化生产力

热门文章

  1. php文件上传错误代码
  2. C# SQLite 数据库操作语句与文件视图管理器
  3. MFC原理 消息传递
  4. 静态方法和实例化方法的本质区别
  5. matlab图片压缩
  6. msf实战提权windows_ATTamp;CK实战 | 红队评估一(上)
  7. Android开发之约束布局平均分布|ConstraintLayout平均分布|约束布局均匀分布|ConstraintLayout均匀分布
  8. cactiez mysql_cactiez使用mysql数据库出现以下报错:“[ERROR] /usr/sbin/mysqld”
  9. 一般图最大匹配——带花树
  10. Android USB转串口通信开发基本流程