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

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

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

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

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

查看源码 打印?
01 <?xml version="1.0" encoding="utf-8"?>
02 <RelativeLayout
03     xmlns:android="http://schemas.android.com/apk/res/android"
04     android:orientation="vertical"
05     android:layout_width="fill_parent"
06     android:layout_height="fill_parent"
07 >
08 <include layout="@layout/head" android:id="@+id/head"/>
09  
10     <cn.com.karl.view.MyGridView
11         android:id="@+id/bookShelf"
12         android:layout_width="fill_parent"
13         android:layout_height="fill_parent"
14         android:layout_below="@id/head"
15         android:cacheColorHint="#00000000"
16         android:columnWidth="90.0dip"
17         android:fadingEdge="none"
18         android:horizontalSpacing="5dp"
19         android:listSelector="#00000000"
20         android:numColumns="3"
21         android:scrollbars="none"
22         android:verticalSpacing="20dp" />
23    
24    <SlidingDrawer
25         android:id="@+id/sliding"
26         android:layout_width="match_parent"
27         android:layout_height="match_parent"
28         android:content="@+id/allApps"
29         android:handle="@+id/imageViewIcon"
30         android:orientation="vertical"
31        
32           
33         <Button
34             android:id="@+id/imageViewIcon"
35             android:layout_width="wrap_content"
36             android:layout_height="wrap_content"
37             android:text="本地"
38             android:textSize="18dp"
39             android:background="@drawable/btn_local" />
40             
41         <GridView
42             android:id="@+id/allApps"
43             android:layout_width="wrap_content"
44             android:layout_height="wrap_content"
45             android:background="@drawable/file_list_bg"
46             android:columnWidth="60dp"
47             android:gravity="center"
48             android:horizontalSpacing="10dp"
49             android:numColumns="auto_fit"
50             android:padding="10dp"
51             android:stretchMode="columnWidth"
52             android:verticalSpacing="10dp" /> 
53      
54      
55  
56     </SlidingDrawer
57  
58 </RelativeLayout>

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

查看源码 打印?
01 public class MyGridView extends GridView {
02  
03     private Bitmap background;
04  
05     public MyGridView(Context context, AttributeSet attrs) {
06         super(context, attrs);
07         background = BitmapFactory.decodeResource(getResources(),
08                 R.drawable.bookshelf_layer_center);
09     }
10  
11     @Override
12     protected void dispatchDraw(Canvas canvas) {
13         int count = getChildCount();
14         int top = count > 0 ? getChildAt(0).getTop() : 0;
15         int backgroundWidth = background.getWidth();
16         int backgroundHeight = background.getHeight()+2;
17         int width = getWidth();
18         int height = getHeight();
19  
20         for (int y = top; y < height; y += backgroundHeight) {
21             for (int x = 0; x < width; x += backgroundWidth) {
22                 canvas.drawBitmap(background, x, y, null);
23             }
24         }
25  
26         super.dispatchDraw(canvas);
27     }
28  
29 }

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

然后是每一个item的布局:

查看源码 打印?
01 <?xml version="1.0" encoding="utf-8"?>
02 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
03     android:layout_width="fill_parent"
04     android:layout_height="fill_parent"
05     android:gravity="center"
06     android:orientation="vertical" >
07     <TextView
08     android:layout_height="110dp"
09     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  
18 </LinearLayout>

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

查看源码 打印?
001 public class BookShelfActivity extends BaseActivity {
002     private GridView bookShelf;
003     private int[] data = {
004             R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,
005             R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,
006             R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,
007             R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,
008             R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,
009             R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,
010             R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,
011             R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt
012            
013     };
014     private String[] name={
015             "天龙八部","搜神记","水浒传","黑道悲情"
016     };
017    
018     private GridView gv; 
019     private SlidingDrawer sd; 
020     private Button iv; 
021     private List<ResolveInfo> apps; 
022    
023  
024     /** Called when the activity is first created. */
025     @Override
026     public void onCreate(Bundle savedInstanceState) {
027         super.onCreate(savedInstanceState);
028         this.requestWindowFeature(Window.FEATURE_NO_TITLE);
029         setContentView(R.layout.main);
030        
031         bookShelf = (GridView) findViewById(R.id.bookShelf);
032         ShlefAdapter adapter=new ShlefAdapter();
033         bookShelf.setAdapter(adapter);
034         bookShelf.setOnItemClickListener(new OnItemClickListener() {
035  
036             @Override
037             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
038                     long arg3) {
039                 // TODO Auto-generated method stub
040                 if(arg2>=data.length){
041                    
042                 }else{
043                    Toast.makeText(getApplicationContext(), ""+arg2, Toast.LENGTH_SHORT).show();
044                 }
045             }
046         });
047         loadApps(); 
048         gv = (GridView) findViewById(R.id.allApps); 
049         sd = (SlidingDrawer) findViewById(R.id.sliding); 
050         iv = (Button) findViewById(R.id.imageViewIcon); 
051         gv.setAdapter(new GridAdapter()); 
052         sd.setOnDrawerOpenListener(new SlidingDrawer.OnDrawerOpenListener()// 开抽屉 
053        
054             @Override 
055             public void onDrawerOpened() { 
056                 iv.setText("返回");
057                 iv.setBackgroundResource(R.drawable.btn_local);// 响应开抽屉事件 
058                                                                 // ,把图片设为向下的 
059            
060         }); 
061         sd.setOnDrawerCloseListener(new SlidingDrawer.OnDrawerCloseListener() { 
062             @Override 
063             public void onDrawerClosed() { 
064                 iv.setText("本地");
065                 iv.setBackgroundResource(R.drawable.btn_local);// 响应关抽屉事件 
066            
067         }); 
068     }
069  
070     class ShlefAdapter extends BaseAdapter{
071  
072         @Override
073         public int getCount() {
074             // TODO Auto-generated method stub
075             return data.length+5;
076         }
077  
078         @Override
079         public Object getItem(int arg0) {
080             // TODO Auto-generated method stub
081             return arg0;
082         }
083  
084         @Override
085         public long getItemId(int arg0) {
086             // TODO Auto-generated method stub
087             return arg0;
088         }
089  
090         @Override
091         public View getView(int position, View contentView, ViewGroup arg2) {
092             // TODO Auto-generated method stub
093            
094             contentView=LayoutInflater.from(getApplicationContext()).inflate(R.layout.item1, null);
095            
096             TextView view=(TextView) contentView.findViewById(R.id.imageView1);
097             if(data.length>position){
098                 if(position<name.length){
099                    view.setText(name[position]);
100                 }
101                 view.setBackgroundResource(data[position]);
102             }else{
103                 view.setBackgroundResource(data[0]);
104                 view.setClickable(false);
105                 view.setVisibility(View.INVISIBLE);
106             }
107             return contentView;
108         }
109        
110     }
111    
112     @Override
113     public boolean onKeyDown(int keyCode, KeyEvent event) {
114         // TODO Auto-generated method stub
115  
116         if (keyCode == KeyEvent.KEYCODE_BACK) {
117             AlertDialog.Builder builder = new AlertDialog.Builder(this);
118             builder.setMessage("你确定退出吗?")
119                     .setCancelable(false)
120                     .setPositiveButton("确定",
121                             new DialogInterface.OnClickListener() {
122                                 public void onClick(DialogInterface dialog,
123                                         int id) {
124                                     finish();
125                                 }
126                             })
127                     .setNegativeButton("返回",
128                             new DialogInterface.OnClickListener() {
129                                 public void onClick(DialogInterface dialog,
130                                         int id) {
131                                     dialog.cancel();
132                                 }
133                             });
134             AlertDialog alert = builder.create();
135             alert.show();
136             return true;
137         }
138  
139         return super.onKeyDown(keyCode, event);
140     }
141    
142    
143     private void loadApps() { 
144         Intent intent = new Intent(Intent.ACTION_MAIN, null); 
145         intent.addCategory(Intent.CATEGORY_LAUNCHER); 
146  
147         apps = getPackageManager().queryIntentActivities(intent, 0); 
148    
149  
150     public class GridAdapter extends BaseAdapter { 
151         public GridAdapter() { 
152  
153        
154  
155         public int getCount() { 
156             // TODO Auto-generated method stub 
157             return apps.size(); 
158        
159  
160         public Object getItem(int position) { 
161             // TODO Auto-generated method stub 
162             return apps.get(position); 
163        
164  
165         public long getItemId(int position) { 
166             // TODO Auto-generated method stub 
167             return position; 
168        
169  
170         public View getView(int position, View convertView, ViewGroup parent) { 
171             // TODO Auto-generated method stub 
172             ImageView imageView = null; 
173             if (convertView == null) { 
174                 imageView = new ImageView(BookShelfActivity.this); 
175                 imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); 
176                 imageView.setLayoutParams(new GridView.LayoutParams(50, 50)); 
177             } else { 
178                 imageView = (ImageView) convertView; 
179            
180  
181             ResolveInfo ri = apps.get(position); 
182             imageView.setImageDrawable(ri.activityInfo 
183                     .loadIcon(getPackageManager())); 
184  
185             return imageView; 
186        
187  
188    
189  
190 }

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

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

转自:http://blog.csdn.net/wangkuifeng0118/article/details/7944215

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. linux修改led中颜色,Linux学习三之LED驱动(修改内核)
  2. java 打印日志log_java如何LOG打印出日志信息
  3. Json.NET 不再有超过120个依赖项
  4. C++——获取array,vector,string的元素个数
  5. Oracle 20c 新特性:基础级内存数据库免费功能 In-Memory Base Level
  6. 第 4 章 程序计数器
  7. 安卓文件操作全解:内部文件、公共文件、私有文件、app静态文件
  8. HTML5+CSS3 从入门到精通(2)
  9. 小白的python学习实录 基础篇(八)面向对象
  10. 金山词霸导致chrome浏览器出错
  11. PHP开源技术大全(四)
  12. 脱不花《沟通的方法》读书笔记(一):学会倾听
  13. 【机器学习】模型评估
  14. 二阶边值问题的数值解matlab,二阶线性微分方程边值问题的MATLAB求解
  15. 计算机 总线带宽计算,电脑各种硬件带宽的计算
  16. 关于Eclipse的基本使用方法
  17. 一个复杂的json例子
  18. 总规、控规、修规、概念性规划之间的关系
  19. 高三计算机基础应用教学计划,一级计算机基础及MS,Office应用教学计划
  20. LaTex公式、函数、希腊字母、符号、运算符号总结

热门文章

  1. 计算机二级msoffice必做题型,计算机二级MS_Office考试PPT题型汇总情况附问题详解...
  2. Unity 中带你写MVC架构
  3. C# winform获取当前屏幕dpi缩小缩放比例
  4. 地球兄弟版星球又出现了 Gliese 832 c系外行星
  5. MySQL基础知识点整理 - 存储引擎
  6. nginx配置一个端口下多个路径转发到html下不同目录
  7. 二进制逆向工程师_怎么样成为一名逆向工程师?
  8. BAT (中国互联网公司三巨头)
  9. X210之uboot源码分析
  10. java 上传速度计算_java – 确定上传的传输速率