广

android开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

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

    2018-04-05 08:32:42 次阅读 稿源:互联网
    广告
    以前也模仿者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;
    }
    }
    }

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

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告