您的位置:首页 > 移动开发 > Android开发

android书架效果

2013-09-13 15:29 148 查看
以前也模仿者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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: