Android自定义控件eBook实现翻书效果实例详解

Android自定义控件eBook实现翻书效果实例详解,第1张

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

本文实例讲述了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文件:

<?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"> <com.book.eBook androID:ID="@+ID/my_book"  androID:layout_wIDth="fill_parent"   androID:layout_height="fill_parent"/></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="http://wallage.blog.163.com/blog/@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代码:

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,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<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,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开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android多媒体 *** 作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家AndroID程序设计有所帮助。

总结

以上是内存溢出为你收集整理的Android自定义控件eBook实现翻书效果实例详解全部内容,希望文章能够帮你解决Android自定义控件eBook实现翻书效果实例详解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1147966.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存