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

无悔风雨伴君行

无悔风雨伴君行

2016-02-19 11:00

图老师小编精心整理的android书架效果实现原理与代码希望大家喜欢,觉得好的亲们记得收藏起来哦!您的支持就是小编更新的动力~
以前也模仿者ireader实现了书架的效果,但是那种是使用listview实现的,并不好用。绝大多数都是用gridview实现的,网上这方面资料比较少,有些开源的电子书都是重点做了阅读,并没有像ireader和QQ阅读这样的书架效果。

书架这种效果我早就实现了,本来想做一个完美的电子书,但是因为自己的懒惰,仅仅持续了一两天,今天又找到了以前的代码分享出来,希望大家能一起实现一个比较完美的开源的电子书。废话不多说先看下效果:
 
本地部分还没有做,做好以后就可以吧本地的书加载到书架里了,这只是一个开始,后面还有很多复杂的没有做。
下面先看一下书架的实现原理吧!
首先看一下layout下的布局文件main.xml
代码如下:

?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中计算每一行的高度,然后把书架画上去。下面是个抽屉。
代码如下:

publicclassMyGridViewextendsGridView{
privateBitmapbackground;
publicMyGridView(Contextcontext,AttributeSetattrs){
super(context,attrs);
background=BitmapFactory.decodeResource(getResources(),
R.drawable.bookshelf_layer_center);
}
@Override
protectedvoiddispatchDraw(Canvascanvas){
intcount=getChildCount();
inttop=count0?getChildAt(0).getTop():0;
intbackgroundWidth=background.getWidth();
intbackgroundHeight=background.getHeight()+2;
intwidth=getWidth();
intheight=getHeight();
for(inty=top;yheight;y+=backgroundHeight){
for(intx=0;xwidth;x+=backgroundWidth){
canvas.drawBitmap(background,x,y,null);
}
}
super.dispatchDraw(canvas);
}
}

上面就是自定义书架的gridview,也是实现书架最核心的方法。
然后是每一个item的布局:
代码如下:

?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中显示出来了。
代码如下:

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;
privateListResolveInfoapps;
/**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.lengthposition){
if(positionname.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;
}
}
}

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

猜你喜欢

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

编程语言 网络编程
android书架效果实现原理与代码

Android在listview添加checkbox实现原理与代码

编程语言 网络编程
Android在listview添加checkbox实现原理与代码

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

android Setting中隐藏项实现原理与代码

编程语言 网络编程
android Setting中隐藏项实现原理与代码

Android裁剪图片为圆形图片的实现原理与代码

编程语言 网络编程
Android裁剪图片为圆形图片的实现原理与代码

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

jQuery 全选效果实现代码

Web开发
jQuery 全选效果实现代码

android IntentService实现原理及内部代码分享

编程语言 网络编程
android IntentService实现原理及内部代码分享

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

FLV怎么添加水印

FLV怎么添加水印

jQuery 1.0.4 - New Wave Javascript(js源文件)

jQuery 1.0.4 - New Wave Javascript(js源文件)
下拉加载更多内容 ↓