android書架效果

jopen 12年前發布 | 46K 次閱讀 Android Android開發 移動開發

            以前也模仿者ireader實現了書架的效果,但是那種是使用listview實現的,并不好用。絕大多數都是用gridview實現的,網上這方面資料比較少,有些開源的電子書都是重點做了閱讀,并沒有像ireader和QQ閱讀這樣的書架效果。

           書架這種效果我早就實現了,本來想做一個完美的電子書,但是因為自己的懶惰,僅僅持續了一兩天,今天又找到了以前的代碼分享出來,希望大家能一起實現一個比較完美的開源的電子書。廢話不多說先看下效果:

    android書架效果    

    本地部分還沒有做,做好以后就可以吧本地的書加載到書架里了,這只是一個開始,后面還有很多復雜的沒有做。

     下面先看一下書架的實現原理吧!

       首先看一下layout下的布局文件main.xml

   

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="

<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></pre>
     上面是個自定義的gridview主要來實現書架,因為每一本書是一個item,在自定義的gridview中計算每一行的高度,然后把書架畫上去。下面是個抽屜。

    

public class MyGridView extends GridView {

private Bitmap background;

public MyGridView(Context context, AttributeSet attrs) {
    super(context, attrs);
    background = BitmapFactory.decodeResource(getResources(),
            R.drawable.bookshelf_layer_center);
}

@Override
protected void dispatchDraw(Canvas canvas) {
    int count = getChildCount();
    int top = count > 0 ? getChildAt(0).getTop() : 0;
    int backgroundWidth = background.getWidth();
    int backgroundHeight = background.getHeight()+2;
    int width = getWidth();
    int height = getHeight();

    for (int y = top; y < height; y += backgroundHeight) {
        for (int x = 0; x < width; x += backgroundWidth) {
            canvas.drawBitmap(background, x, y, null);
        }
    }

    super.dispatchDraw(canvas);
}

}</pre>
    上面就是自定義書架的gridview,也是實現書架最核心的方法。

    然后是每一個item的布局:

   

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="

</LinearLayout></pre>      最后就可以在主activity中顯示出來了。

  

public class BookShelfActivity extends BaseActivity {
    private GridView bookShelf;
    private int[] 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

};
private String[] name={
        "天龍八部","搜神記","水滸傳","黑道悲情"
};

private GridView gv;  
private SlidingDrawer sd;  
private Button iv;  
private List<ResolveInfo> apps;  


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);

    bookShelf = (GridView) findViewById(R.id.bookShelf);
    ShlefAdapter adapter=new ShlefAdapter();
    bookShelf.setAdapter(adapter);
    bookShelf.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub
            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(new GridAdapter());  
    sd.setOnDrawerOpenListener(new SlidingDrawer.OnDrawerOpenListener()// 開抽屜  
    {  
        @Override  
        public void onDrawerOpened() {  
            iv.setText("返回");
            iv.setBackgroundResource(R.drawable.btn_local);// 響應開抽屜事件  
                                                            // ,把圖片設為向下的  
        }  
    });  
    sd.setOnDrawerCloseListener(new SlidingDrawer.OnDrawerCloseListener() {  
        @Override  
        public void onDrawerClosed() {  
            iv.setText("本地");
            iv.setBackgroundResource(R.drawable.btn_local);// 響應關抽屜事件  
        }  
    });  
}

class ShlefAdapter extends BaseAdapter{

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return data.length+5;
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return arg0;
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return arg0;
    }

    @Override
    public View getView(int position, View contentView, ViewGroup arg2) {
        // TODO Auto-generated method stub

        contentView=LayoutInflater.from(getApplicationContext()).inflate(R.layout.item1, null);

        TextView view=(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);
        }
        return contentView;
    }

}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub

    if (keyCode == KeyEvent.KEYCODE_BACK) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("你確定退出嗎?")
                .setCancelable(false)
                .setPositiveButton("確定",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int id) {
                                finish();
                            }
                        })
                .setNegativeButton("返回",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int id) {
                                dialog.cancel();
                            }
                        });
        AlertDialog alert = builder.create();
        alert.show();
        return true;
    }

    return super.onKeyDown(keyCode, event);
}


private void loadApps() {  
    Intent intent = new Intent(Intent.ACTION_MAIN, null);  
    intent.addCategory(Intent.CATEGORY_LAUNCHER);  

    apps = getPackageManager().queryIntentActivities(intent, 0);  
}  

public class GridAdapter extends BaseAdapter {  
    public GridAdapter() {  

    }  

    public int getCount() {  
        // TODO Auto-generated method stub  
        return apps.size();  
    }  

    public Object getItem(int position) {  
        // TODO Auto-generated method stub  
        return apps.get(position);  
    }  

    public long getItemId(int position) {  
        // TODO Auto-generated method stub  
        return position;  
    }  

    public View getView(int position, View convertView, ViewGroup parent) {  
        // TODO Auto-generated method stub  
        ImageView imageView = null;  
        if (convertView == null) {  
            imageView = new ImageView(BookShelfActivity.this);  
            imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);  
            imageView.setLayoutParams(new GridView.LayoutParams(50, 50));  
        } else {  
            imageView = (ImageView) convertView;  
        }  

        ResolveInfo ri = apps.get(position);  
        imageView.setImageDrawable(ri.activityInfo  
                .loadIcon(getPackageManager()));  

        return imageView;  
    }  

}  

}</pre>    代碼寫的有點亂,有待整理下,哈哈。
    上面只是一個畫龍點睛的作用,真要實現一個好的電子書,后面還有跟多的工作,也希望有興趣的朋友能在此基礎上實現一個完美的電子書,然后把源代碼開放,這樣我就不用在往下做了,嘎嘎。

    最后附上源碼下載地址:點擊打開鏈接

轉自:http://blog.csdn.net/wangkuifeng0118/article/details/7944215

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!