android书架效果
以前也模仿者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书架效果相关推荐
- android书架效果 .
以前也模仿者ireader实现了书架的效果,但是那种是使用listview实现的,并不好用.绝大多数都是用gridview实现的,网上这方面资料比较少,有些开源的电子书都是重点做了阅读,并没有像ire ...
- android 书架菜单,android 书架效果实现
list_item.xml <?xml version="1.0" encoding="utf-8"?> android:layout_width= ...
- android使用gridview的书架效果
android使用gridview的书架效果,需要使用自定义的gridview来填充每行的背景,核心代码如下: BookGridView.java /*** 书架效果**/ public class ...
- Android书架实现
转自http://blog.csdn.net/wangkuifeng0118/article/details/7944215 书架效果: 下面先看一下书架的实现原理吧! 首先看一下layout下的布局 ...
- Android 抽屉效果Demo
2019独角兽企业重金招聘Python工程师标准>>> Android 抽屉效果Demo. 转载:http://www.adobex.com/android/source/detai ...
- android中倒计时动画,简单实现Android倒计时效果
本文实例为大家分享了Android倒计时效果的具体代码,供大家参考,具体内容如下 需求: a.在后台添加时,如果是今日直播,则需要添加开始时间(精确到秒): b.离开始时间超过1天,显示为:" ...
- 程序员表白神器。安卓程序员表白软件。程序员追女友利器=android+雪花效果+彩色气泡+心形花园+心形玫瑰花+相爱天数计时器
程序员表白神器.安卓程序员表白软件.程序员追女友利器=android+雪花效果+彩色气泡+心形花园+心形玫瑰花 +相爱天数计时器. APK下载(把这个给女朋友,她一定会高兴的):http://down ...
- android 圆角效果
android 圆角效果 最近做一个效果,要一个上边两个角为圆角,下面两个角为直角的四边形白色背景: 如下图: 这里用到了shape属性中的corners 属性, api原文中是这样: <cor ...
- Android 3D效果的实现
系列文章目录 Android 3D效果的实现 文章目录 系列文章目录 前言 一.先看看聊天(需求) 二.实现效果 三.实现 1.通过getSystemService获得SensorManager实例对 ...
最新文章
- linux修改led中颜色,Linux学习三之LED驱动(修改内核)
- java 打印日志log_java如何LOG打印出日志信息
- Json.NET 不再有超过120个依赖项
- C++——获取array,vector,string的元素个数
- Oracle 20c 新特性:基础级内存数据库免费功能 In-Memory Base Level
- 第 4 章 程序计数器
- 安卓文件操作全解:内部文件、公共文件、私有文件、app静态文件
- HTML5+CSS3 从入门到精通(2)
- 小白的python学习实录 基础篇(八)面向对象
- 金山词霸导致chrome浏览器出错
- PHP开源技术大全(四)
- 脱不花《沟通的方法》读书笔记(一):学会倾听
- 【机器学习】模型评估
- 二阶边值问题的数值解matlab,二阶线性微分方程边值问题的MATLAB求解
- 计算机 总线带宽计算,电脑各种硬件带宽的计算
- 关于Eclipse的基本使用方法
- 一个复杂的json例子
- 总规、控规、修规、概念性规划之间的关系
- 高三计算机基础应用教学计划,一级计算机基础及MS,Office应用教学计划
- LaTex公式、函数、希腊字母、符号、运算符号总结
热门文章
- 计算机二级msoffice必做题型,计算机二级MS_Office考试PPT题型汇总情况附问题详解...
- Unity 中带你写MVC架构
- C# winform获取当前屏幕dpi缩小缩放比例
- 地球兄弟版星球又出现了 Gliese 832 c系外行星
- MySQL基础知识点整理 - 存储引擎
- nginx配置一个端口下多个路径转发到html下不同目录
- 二进制逆向工程师_怎么样成为一名逆向工程师?
- BAT (中国互联网公司三巨头)
- X210之uboot源码分析
- java 上传速度计算_java – 确定上传的传输速率