以前也模仿者ireader实现了书架的效果,但是那种是使用listview实现的,并不好用。绝大多数都是用gridview实现的,网上这方面资料比较少,有些开源的电子书都是重点做了阅读,并没有像ireader和QQ阅读这样的书架效果。

书架这种效果我早就实现了,本来想做一个完美的电子书,但是因为自己的懒惰,仅仅持续了一两天,今天又找到了以前的代码分享出来,希望大家能一起实现一个比较完美的开源的电子书。废话不多说先看下效果:

本地部分还没有做,做好以后就可以吧本地的书加载到书架里了,这只是一个开始,后面还有很多复杂的没有做。

下面先看一下书架的实现原理吧!

首先看一下layout下的布局文件main.xml

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:orientation="vertical"
  5. android:layout_width="fill_parent"
  6. android:layout_height="fill_parent"
  7. >
  8. <include layout="@layout/head" android:id="@+id/head"/>
  9. <cn.com.karl.view.MyGridView
  10. android:id="@+id/bookShelf"
  11. android:layout_width="fill_parent"
  12. android:layout_height="fill_parent"
  13. android:layout_below="@id/head"
  14. android:cacheColorHint="#00000000"
  15. android:columnWidth="90.0dip"
  16. android:fadingEdge="none"
  17. android:horizontalSpacing="5dp"
  18. android:listSelector="#00000000"
  19. android:numColumns="3"
  20. android:scrollbars="none"
  21. android:verticalSpacing="20dp" />
  22. <SlidingDrawer
  23. android:id="@+id/sliding"
  24. android:layout_width="match_parent"
  25. android:layout_height="match_parent"
  26. android:content="@+id/allApps"
  27. android:handle="@+id/imageViewIcon"
  28. android:orientation="vertical" >
  29. <Button
  30. android:id="@+id/imageViewIcon"
  31. android:layout_width="wrap_content"
  32. android:layout_height="wrap_content"
  33. android:text="本地"
  34. android:textSize="18dp"
  35. android:background="@drawable/btn_local" />
  36. <GridView
  37. android:id="@+id/allApps"
  38. android:layout_width="wrap_content"
  39. android:layout_height="wrap_content"
  40. android:background="@drawable/file_list_bg"
  41. android:columnWidth="60dp"
  42. android:gravity="center"
  43. android:horizontalSpacing="10dp"
  44. android:numColumns="auto_fit"
  45. android:padding="10dp"
  46. android:stretchMode="columnWidth"
  47. android:verticalSpacing="10dp" />
  48. </SlidingDrawer>
  49. </RelativeLayout>

上面是个自定义的gridview主要来实现书架,因为每一本书是一个item,在自定义的gridview中计算每一行的高度,然后把书架画上去。下面是个抽屉。

[html] view plaincopyprint?
  1. public class MyGridView extends GridView {
  2. private Bitmap background;
  3. public MyGridView(Context context, AttributeSet attrs) {
  4. super(context, attrs);
  5. background = BitmapFactory.decodeResource(getResources(),
  6. R.drawable.bookshelf_layer_center);
  7. }
  8. @Override
  9. protected void dispatchDraw(Canvas canvas) {
  10. int count = getChildCount();
  11. int top = count > 0 ? getChildAt(0).getTop() : 0;
  12. int backgroundWidth = background.getWidth();
  13. int backgroundHeight = background.getHeight()+2;
  14. int width = getWidth();
  15. int height = getHeight();
  16. for (int y = top; y < height; y += backgroundHeight) {
  17. for (int x = 0; x < width; x += backgroundWidth) {
  18. canvas.drawBitmap(background, x, y, null);
  19. }
  20. }
  21. super.dispatchDraw(canvas);
  22. }
  23. }

上面就是自定义书架的gridview,也是实现书架最核心的方法。

然后是每一个item的布局:

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:gravity="center"
  6. android:orientation="vertical" >
  7. <TextView
  8. android:layout_height="110dp"
  9. android:layout_width="90dp"
  10. android:layout_marginTop="10dp"
  11. android:background="@drawable/cover_txt"
  12. android:id="@+id/imageView1"
  13. android:text="天龙八部"
  14. android:padding="15dp"
  15. android:textColor="#000000"
  16. />
  17. </LinearLayout>

最后就可以在主activity中显示出来了。

[html] view plaincopyprint?
  1. public class BookShelfActivity extends BaseActivity {
  2. private GridView bookShelf;
  3. private int[] data = {
  4. R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,
  5. R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,
  6. R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,
  7. R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,
  8. R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,
  9. R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,
  10. R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,
  11. R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt
  12. };
  13. private String[] name={
  14. "天龙八部","搜神记","水浒传","黑道悲情"
  15. };
  16. private GridView gv;
  17. private SlidingDrawer sd;
  18. private Button iv;
  19. private List<ResolveInfo> apps;
  20. /** Called when the activity is first created. */
  21. @Override
  22. public void onCreate(Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. this.requestWindowFeature(Window.FEATURE_NO_TITLE);
  25. setContentView(R.layout.main);
  26. bookShelf = (GridView) findViewById(R.id.bookShelf);
  27. ShlefAdapter adapter=new ShlefAdapter();
  28. bookShelf.setAdapter(adapter);
  29. bookShelf.setOnItemClickListener(new OnItemClickListener() {
  30. @Override
  31. public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
  32. long arg3) {
  33. // TODO Auto-generated method stub
  34. if(arg2>=data.length){
  35. }else{
  36. Toast.makeText(getApplicationContext(), ""+arg2, Toast.LENGTH_SHORT).show();
  37. }
  38. }
  39. });
  40. loadApps();
  41. gv = (GridView) findViewById(R.id.allApps);
  42. sd = (SlidingDrawer) findViewById(R.id.sliding);
  43. iv = (Button) findViewById(R.id.imageViewIcon);
  44. gv.setAdapter(new GridAdapter());
  45. sd.setOnDrawerOpenListener(new SlidingDrawer.OnDrawerOpenListener()// 开抽屉
  46. {
  47. @Override
  48. public void onDrawerOpened() {
  49. iv.setText("返回");
  50. iv.setBackgroundResource(R.drawable.btn_local);// 响应开抽屉事件
  51. // ,把图片设为向下的
  52. }
  53. });
  54. sd.setOnDrawerCloseListener(new SlidingDrawer.OnDrawerCloseListener() {
  55. @Override
  56. public void onDrawerClosed() {
  57. iv.setText("本地");
  58. iv.setBackgroundResource(R.drawable.btn_local);// 响应关抽屉事件
  59. }
  60. });
  61. }
  62. class ShlefAdapter extends BaseAdapter{
  63. @Override
  64. public int getCount() {
  65. // TODO Auto-generated method stub
  66. return data.length+5;
  67. }
  68. @Override
  69. public Object getItem(int arg0) {
  70. // TODO Auto-generated method stub
  71. return arg0;
  72. }
  73. @Override
  74. public long getItemId(int arg0) {
  75. // TODO Auto-generated method stub
  76. return arg0;
  77. }
  78. @Override
  79. public View getView(int position, View contentView, ViewGroup arg2) {
  80. // TODO Auto-generated method stub
  81. contentView=LayoutInflater.from(getApplicationContext()).inflate(R.layout.item1, null);
  82. TextView view=(TextView) contentView.findViewById(R.id.imageView1);
  83. if(data.length>position){
  84. if(position<name.length){
  85. view.setText(name[position]);
  86. }
  87. view.setBackgroundResource(data[position]);
  88. }else{
  89. view.setBackgroundResource(data[0]);
  90. view.setClickable(false);
  91. view.setVisibility(View.INVISIBLE);
  92. }
  93. return contentView;
  94. }
  95. }
  96. @Override
  97. public boolean onKeyDown(int keyCode, KeyEvent event) {
  98. // TODO Auto-generated method stub
  99. if (keyCode == KeyEvent.KEYCODE_BACK) {
  100. AlertDialog.Builder builder = new AlertDialog.Builder(this);
  101. builder.setMessage("你确定退出吗?")
  102. .setCancelable(false)
  103. .setPositiveButton("确定",
  104. new DialogInterface.OnClickListener() {
  105. public void onClick(DialogInterface dialog,
  106. int id) {
  107. finish();
  108. }
  109. })
  110. .setNegativeButton("返回",
  111. new DialogInterface.OnClickListener() {
  112. public void onClick(DialogInterface dialog,
  113. int id) {
  114. dialog.cancel();
  115. }
  116. });
  117. AlertDialog alert = builder.create();
  118. alert.show();
  119. return true;
  120. }
  121. return super.onKeyDown(keyCode, event);
  122. }
  123. private void loadApps() {
  124. Intent intent = new Intent(Intent.ACTION_MAIN, null);
  125. intent.addCategory(Intent.CATEGORY_LAUNCHER);
  126. apps = getPackageManager().queryIntentActivities(intent, 0);
  127. }
  128. public class GridAdapter extends BaseAdapter {
  129. public GridAdapter() {
  130. }
  131. public int getCount() {
  132. // TODO Auto-generated method stub
  133. return apps.size();
  134. }
  135. public Object getItem(int position) {
  136. // TODO Auto-generated method stub
  137. return apps.get(position);
  138. }
  139. public long getItemId(int position) {
  140. // TODO Auto-generated method stub
  141. return position;
  142. }
  143. public View getView(int position, View convertView, ViewGroup parent) {
  144. // TODO Auto-generated method stub
  145. ImageView imageView = null;
  146. if (convertView == null) {
  147. imageView = new ImageView(BookShelfActivity.this);
  148. imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
  149. imageView.setLayoutParams(new GridView.LayoutParams(50, 50));
  150. } else {
  151. imageView = (ImageView) convertView;
  152. }
  153. ResolveInfo ri = apps.get(position);
  154. imageView.setImageDrawable(ri.activityInfo
  155. .loadIcon(getPackageManager()));
  156. return imageView;
  157. }
  158. }
  159. }

代码写的有点乱,有待整理下,哈哈。
    上面只是一个画龙点睛的作用,真要实现一个好的电子书,后面还有跟多的工作,也希望有兴趣的朋友能在此基础上实现一个完美的电子书,然后把源代码开放,这样我就不用在往下做了,嘎嘎。

最后附上源码下载地址:点击打开链接

android书架效果 .相关推荐

  1. android书架效果

    以前也模仿者ireader实现了书架的效果,但是那种是使用listview实现的,并不好用.绝大多数都是用gridview实现的,网上这方面资料比较少,有些开源的电子书都是重点做了阅读,并没有像ire ...

  2. android 书架菜单,android 书架效果实现

    list_item.xml <?xml version="1.0" encoding="utf-8"?> android:layout_width= ...

  3. android使用gridview的书架效果

    android使用gridview的书架效果,需要使用自定义的gridview来填充每行的背景,核心代码如下: BookGridView.java /*** 书架效果**/ public class ...

  4. Android书架实现

    转自http://blog.csdn.net/wangkuifeng0118/article/details/7944215 书架效果: 下面先看一下书架的实现原理吧! 首先看一下layout下的布局 ...

  5. Android 抽屉效果Demo

    2019独角兽企业重金招聘Python工程师标准>>> Android 抽屉效果Demo. 转载:http://www.adobex.com/android/source/detai ...

  6. android中倒计时动画,简单实现Android倒计时效果

    本文实例为大家分享了Android倒计时效果的具体代码,供大家参考,具体内容如下 需求: a.在后台添加时,如果是今日直播,则需要添加开始时间(精确到秒): b.离开始时间超过1天,显示为:" ...

  7. 程序员表白神器。安卓程序员表白软件。程序员追女友利器=android+雪花效果+彩色气泡+心形花园+心形玫瑰花+相爱天数计时器

    程序员表白神器.安卓程序员表白软件.程序员追女友利器=android+雪花效果+彩色气泡+心形花园+心形玫瑰花 +相爱天数计时器. APK下载(把这个给女朋友,她一定会高兴的):http://down ...

  8. android 圆角效果

    android 圆角效果 最近做一个效果,要一个上边两个角为圆角,下面两个角为直角的四边形白色背景: 如下图: 这里用到了shape属性中的corners 属性, api原文中是这样: <cor ...

  9. Android 3D效果的实现

    系列文章目录 Android 3D效果的实现 文章目录 系列文章目录 前言 一.先看看聊天(需求) 二.实现效果 三.实现 1.通过getSystemService获得SensorManager实例对 ...

最新文章

  1. ccls提示找不到文件
  2. 学计算机科学与技术的专业特长,计算机科学与技术专业简历范文介绍
  3. 浅入深出之Java集合框架(中)
  4. connectionString加密
  5. 我花了一夜用数据结构给女朋友写个H5走迷宫游戏 | CSDN 博文精选
  6. 《A First Course in Probability》-chaper3-条件概率和独立性-贝叶斯公式、全概率公式...
  7. vue2.x使用jsoneditor编辑器
  8. 空行的符号 计算机,word中空白行的回车符号怎么消除 消除word中的回车符号
  9. 为招商手机银行点个赞!
  10. linux 流量控制
  11. 企业落地级jmeter性能测试,结果分析以及报告(4-3)
  12. iHerb中国这个app怎么样?iHerb中国邮政EMS与顺丰速运区别点在哪里?
  13. 我在北京每月白捡一万元(转贴)
  14. 案例29:气体灭火设施检测与验收案例分析(一)
  15. 新手站长做网站SEO的无奈与煎熬
  16. 【PHP】break跳出多层循环用法
  17. 每月产量不均衡,怎样分摊费用更合理?
  18. 《深入理解计算机系统》(原书第三版)家庭作业第三章(3.63)解答
  19. 计算机自强之星个人事迹简介,诚信自强之星个人事迹简介
  20. 对一款远控的个人分析

热门文章

  1. 国家文物局:长城修复不能简单按一个统一标准进行
  2. Python基础篇(七)
  3. 关于印发《湖南省首版次软件产品认定管理办法》的通知
  4. C语言第五章实验原理,C语言第五章实验报告.docx
  5. ajax实现省市三级联动
  6. FTP文件传输协议原理详解(两种工作模式)
  7. 状态机控制移位寄存器multisim仿真过程中出现的状态变量和状态转移条件不匹配的问题
  8. Spark RDD基本操作
  9. JS 将毫秒数时间,转化为时间格式(yy-MM-dd)
  10. 【JS】javascript正则表达式的基本使用(JavaScript RegExp 对象)