源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

android书架效果实现原理与代码

  • 时间:2021-08-10 13:53 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:android书架效果实现原理与代码
以前也模仿者ireader实现了书架的效果,但是那种是使用listview实现的,并不好用。绝大多数都是用gridview实现的,网上这方面资料比较少,有些开源的电子书都是重点做了阅读,并没有像ireader和QQ阅读这样的书架效果。 书架这种效果我早就实现了,本来想做一个完美的电子书,但是因为自己的懒惰,仅仅持续了一两天,今天又找到了以前的代码分享出来,希望大家能一起实现一个比较完美的开源的电子书。废话不多说先看下效果: [img]http://files.jb51.net/file_images/article/201301/201312162325216.jpg[/img]   本地部分还没有做,做好以后就可以吧本地的书加载到书架里了,这只是一个开始,后面还有很多复杂的没有做。 下面先看一下书架的实现原理吧! 首先看一下layout下的布局文件main.xml
[u]复制代码[/u] 代码如下:
<?xmlversion="1.0"encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <includelayout="@layout/head"android:id="@+id/head"/> <cn.com.karl.view.MyGridView android:id="@+id/bookShelf" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@id/head" android:cacheColorHint="#00000000" android:columnWidth="90.0dip" android:fadingEdge="none" android:horizontalSpacing="5dp" android:listSelector="#00000000" android:numColumns="3" android:scrollbars="none" android:verticalSpacing="20dp"/> <SlidingDrawer android:id="@+id/sliding" android:layout_width="match_parent" android:layout_height="match_parent" android:content="@+id/allApps" android:handle="@+id/imageViewIcon" android:orientation="vertical"> <Button android:id="@+id/imageViewIcon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="本地" android:textSize="18dp" android:background="@drawable/btn_local"/> <GridView android:id="@+id/allApps" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/file_list_bg" android:columnWidth="60dp" android:gravity="center" android:horizontalSpacing="10dp" android:numColumns="auto_fit" android:padding="10dp" android:stretchMode="columnWidth" android:verticalSpacing="10dp"/> </SlidingDrawer> </RelativeLayout>
上面是个自定义的gridview主要来实现书架,因为每一本书是一个item,在自定义的gridview中计算每一行的高度,然后把书架画上去。下面是个抽屉。
[u]复制代码[/u] 代码如下:
publicclassMyGridViewextendsGridView{ privateBitmapbackground; publicMyGridView(Contextcontext,AttributeSetattrs){ super(context,attrs); background=BitmapFactory.decodeResource(getResources(), R.drawable.bookshelf_layer_center); } @Override protectedvoiddispatchDraw(Canvascanvas){ intcount=getChildCount(); inttop=count>0?getChildAt(0).getTop():0; intbackgroundWidth=background.getWidth(); intbackgroundHeight=background.getHeight()+2; intwidth=getWidth(); intheight=getHeight(); for(inty=top;y<height;y+=backgroundHeight){ for(intx=0;x<width;x+=backgroundWidth){ canvas.drawBitmap(background,x,y,null); } } super.dispatchDraw(canvas); } }
上面就是自定义书架的gridview,也是实现书架最核心的方法。 然后是每一个item的布局:
[u]复制代码[/u] 代码如下:
<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:orientation="vertical"> <TextView android:layout_height="110dp" android:layout_width="90dp" android:layout_marginTop="10dp" android:background="@drawable/cover_txt" android:id="@+id/imageView1" android:text="天龙八部" android:padding="15dp" android:textColor="#000000" /> </LinearLayout>
最后就可以在主activity中显示出来了。
[u]复制代码[/u] 代码如下:
publicclassBookShelfActivityextendsBaseActivity{ privateGridViewbookShelf; privateint[]data={ R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt, R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt, R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt, R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt, R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt, R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt, R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt, R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt,R.drawable.cover_txt }; privateString[]name={ "天龙八部","搜神记","水浒传","黑道悲情" }; privateGridViewgv; privateSlidingDrawersd; privateButtoniv; privateList<ResolveInfo>apps; /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); bookShelf=(GridView)findViewById(R.id.bookShelf); ShlefAdapteradapter=newShlefAdapter(); bookShelf.setAdapter(adapter); bookShelf.setOnItemClickListener(newOnItemClickListener(){ @Override publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2, longarg3){ //TODOAuto-generatedmethodstub if(arg2>=data.length){ }else{ Toast.makeText(getApplicationContext(),""+arg2,Toast.LENGTH_SHORT).show(); } } }); loadApps(); gv=(GridView)findViewById(R.id.allApps); sd=(SlidingDrawer)findViewById(R.id.sliding); iv=(Button)findViewById(R.id.imageViewIcon); gv.setAdapter(newGridAdapter()); sd.setOnDrawerOpenListener(newSlidingDrawer.OnDrawerOpenListener()//开抽屉 { @Override publicvoidonDrawerOpened(){ iv.setText("返回"); iv.setBackgroundResource(R.drawable.btn_local);//响应开抽屉事件 //,把图片设为向下的 } }); sd.setOnDrawerCloseListener(newSlidingDrawer.OnDrawerCloseListener(){ @Override publicvoidonDrawerClosed(){ iv.setText("本地"); iv.setBackgroundResource(R.drawable.btn_local);//响应关抽屉事件 } }); } classShlefAdapterextendsBaseAdapter{ @Override publicintgetCount(){ //TODOAuto-generatedmethodstub returndata.length+5; } @Override publicObjectgetItem(intarg0){ //TODOAuto-generatedmethodstub returnarg0; } @Override publiclonggetItemId(intarg0){ //TODOAuto-generatedmethodstub returnarg0; } @Override publicViewgetView(intposition,ViewcontentView,ViewGrouparg2){ //TODOAuto-generatedmethodstub contentView=LayoutInflater.from(getApplicationContext()).inflate(R.layout.item1,null); TextViewview=(TextView)contentView.findViewById(R.id.imageView1); if(data.length>position){ if(position<name.length){ view.setText(name[position]); } view.setBackgroundResource(data[position]); }else{ view.setBackgroundResource(data[0]); view.setClickable(false); view.setVisibility(View.INVISIBLE); } returncontentView; } } @Override publicbooleanonKeyDown(intkeyCode,KeyEventevent){ //TODOAuto-generatedmethodstub if(keyCode==KeyEvent.KEYCODE_BACK){ AlertDialog.Builderbuilder=newAlertDialog.Builder(this); builder.setMessage("你确定退出吗?") .setCancelable(false) .setPositiveButton("确定", newDialogInterface.OnClickListener(){ publicvoidonClick(DialogInterfacedialog, intid){ finish(); } }) .setNegativeButton("返回", newDialogInterface.OnClickListener(){ publicvoidonClick(DialogInterfacedialog, intid){ dialog.cancel(); } }); AlertDialogalert=builder.create(); alert.show(); returntrue; } returnsuper.onKeyDown(keyCode,event); } privatevoidloadApps(){ Intentintent=newIntent(Intent.ACTION_MAIN,null); intent.addCategory(Intent.CATEGORY_LAUNCHER); apps=getPackageManager().queryIntentActivities(intent,0); } publicclassGridAdapterextendsBaseAdapter{ publicGridAdapter(){ } publicintgetCount(){ //TODOAuto-generatedmethodstub returnapps.size(); } publicObjectgetItem(intposition){ //TODOAuto-generatedmethodstub returnapps.get(position); } publiclonggetItemId(intposition){ //TODOAuto-generatedmethodstub returnposition; } publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ //TODOAuto-generatedmethodstub ImageViewimageView=null; if(convertView==null){ imageView=newImageView(BookShelfActivity.this); imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); imageView.setLayoutParams(newGridView.LayoutParams(50,50)); }else{ imageView=(ImageView)convertView; } ResolveInfori=apps.get(position); imageView.setImageDrawable(ri.activityInfo .loadIcon(getPackageManager())); returnimageView; } } }
代码写的有点乱,有待整理下,哈哈。 上面只是一个画龙点睛的作用,真要实现一个好的电子书,后面还有跟多的工作,也希望有兴趣的朋友能在此基础上实现一个完美的电子书,然后把源代码开放,这样我就不用在往下做了,嘎嘎。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部