android书架效果
2013-09-13 15:29
148 查看
以前也模仿者ireader实现了书架的效果,但是那种是使用listview实现的,并不好用。绝大多数都是用gridview实现的,网上这方面资料比较少,有些开源的电子书都是重点做了阅读,并没有像ireader和QQ阅读这样的书架效果。书架这种效果我早就实现了,本来想做一个完美的电子书,但是因为自己的懒惰,仅仅持续了一两天,今天又找到了以前的代码分享出来,希望大家能一起实现一个比较完美的开源的电子书。废话不多说先看下效果:本地部分还没有做,做好以后就可以吧本地的书加载到书架里了,这只是一个开始,后面还有很多复杂的没有做。下面先看一下书架的实现原理吧!首先看一下layout下的布局文件main.xml查看源码打印?
上面是个自定义的gridview主要来实现书架,因为每一本书是一个item,在自定义的gridview中计算每一行的高度,然后把书架画上去。下面是个抽屉。查看源码打印?
上面就是自定义书架的gridview,也是实现书架最核心的方法。然后是每一个item的布局:查看源码打印?
最后就可以在主activity中显示出来了。查看源码打印?
代码写的有点乱,有待整理下,哈哈。上面只是一个画龙点睛的作用,真要实现一个好的电子书,后面还有跟多的工作,也希望有兴趣的朋友能在此基础上实现一个完美的电子书,然后把源代码开放,这样我就不用在往下做了,嘎嘎。最后附上源码下载地址:点击打开链接转自:http://blog.csdn.net/wangkuifeng0118/article/details/7944215
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 > |
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 | } |
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 > |
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 | } |
相关文章推荐
- android书架效果背景图处理
- android书架效果 .
- Android中GridView的书架效果实现
- android书架效果,可以触底刷新
- android view增加点击效果,如:iReader书架书籍点击变暗
- android 书架效果实现
- android书架效果
- android书架效果
- Android开发之抽屉效果及ireader书架效果--SlidingDrawer
- Android编程之书架效果背景图处理方法
- android书架效果实现原理与代码
- Android动画(Animation)效果
- 【凯子哥带你做高仿】“煎蛋”Android版的高仿及优化(二)——大图显示模式、评论“盖楼”效果实现详解
- Android实现歌词渐变色和进度的效果
- Android自定义View——刮刮卡效果
- Android动画效果translate、scale、alpha、rotate
- Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果
- Android PullToRefreshView巴黎埃菲尔铁塔效果
- Android弹幕功能实现,模仿斗鱼直播的弹幕效果
- Android 编程下模拟 HOME 键效果