android书架效果实现原理与代码_安卓软件开发教程-查字典教程网
android书架效果实现原理与代码
android书架效果实现原理与代码
发布时间:2016-12-28 来源:查字典编辑
摘要:以前也模仿者ireader实现了书架的效果,但是那种是使用listview实现的,并不好用。绝大多数都是用gridview实现的,网上这方面...

以前也模仿者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=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的布局:

复制代码 代码如下:

<?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;

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;

}

}

}

代码写的有点乱,有待整理下,哈哈。

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

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新安卓软件开发学习
    热门安卓软件开发学习
    编程开发子分类