首页 > 代码库 > 自定义tab bar控件 学习资料

自定义tab bar控件 学习资料

http://blog.csdn.net/zoeice/article/details/8068671

  1. import java.util.Vector;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.BitmapFactory;  
  6. import android.graphics.Canvas;  
  7. import android.graphics.NinePatch;  
  8. import android.graphics.Paint;  
  9. import android.graphics.Rect;  
  10. import android.util.DisplayMetrics;  
  11. import android.view.GestureDetector;  
  12. import android.view.GestureDetector.OnGestureListener;  
  13. import android.view.MotionEvent;  
  14. import android.view.View;  
  15. import android.view.View.OnTouchListener;  
  16. import android.widget.PopupWindow;  
  17.   
  18. import com.example.zoeicetabgroup.R;  
  19.   
  20. /** 
  21.  * custom tab bar 
  22.  * @author zoeice 
  23.  * 
  24.  */  
  25. public class LPTabGroupWithGesture extends View implements OnGestureListener, OnTouchListener{  
  26.     private int tabNum = 0;  
  27.     private int curSelect = 0;  
  28.     private int curX = 0;  
  29.     private int savedClickIndex = -1;  
  30.     private int savedX = 0;  
  31.       
  32.     private boolean isDraging = false;  
  33.     private int dragCurrentX = 0;  
  34.     private int dragSavedX = 0;  
  35.     private int dragSelectIndex = -1;  
  36.       
  37.     private final int TEXT_SIZE = 30;  
  38.     private final int TAB_MARGIN = 30;  
  39.       
  40.     private int tabWidth = 200;  
  41.     private int tabHeight = 0;  
  42.     private int tabGap = 30;// IF  
  43.     private int tabAddWidth = 90;// IF  
  44.   
  45.     private Bitmap bitCur;  
  46.     private NinePatch npCur;  
  47.     private Bitmap bitNor;  
  48.     private NinePatch npNor;  
  49.     private Bitmap bitAdd;  
  50.   
  51.     private int screenWidth;  
  52.     private int screenHeight;  
  53.     private float screenDensity;  
  54.       
  55.     private PopupWindow popMenu;  
  56.       
  57.     private OnTabItemClickListener clickListener;  
  58.   
  59.     private GestureDetector mGestureDetector;  
  60.       
  61.     private Vector<TabItem> tabLists = new Vector<TabItem>();  
  62.       
  63.     public LPTabGroupWithGesture(Context context, Vector<TabItem> vec) {  
  64.         this(context);  
  65.         tabLists = vec;  
  66.         tabNum = vec.size();  
  67.     }  
  68.       
  69.     public LPTabGroupWithGesture(Context context) {  
  70.         super(context);  
  71.         if(tabNum == 0){  
  72.             tabNum = 1;  
  73.             tabLists.add(new TabItem());  
  74.         }  
  75.           
  76.         initParams(context);  
  77.     }  
  78.   
  79.     /** 
  80.      * init view‘s params 
  81.      */  
  82.     private void initParams(Context context){  
  83.         this.setLongClickable(true);  
  84.         this.setOnTouchListener(this);  
  85.         mGestureDetector = new GestureDetector(context, this);  
  86.         mGestureDetector.setIsLongpressEnabled(true);  
  87.           
  88.         DisplayMetrics displayMetrics = getResources().getDisplayMetrics();  
  89.         screenWidth = displayMetrics.widthPixels;  
  90.         screenHeight = displayMetrics.heightPixels;  
  91.         screenDensity = displayMetrics.density;  
  92.           
  93.         bitCur = BitmapFactory.decodeResource(getResources(),  
  94.                 R.drawable.tab);  
  95.         npCur = new NinePatch(bitCur, bitCur.getNinePatchChunk(), null);  
  96.         tabHeight = bitCur.getHeight();  
  97.           
  98.         bitNor = BitmapFactory.decodeResource(getResources(),  
  99.                 R.drawable.tab);  
  100.         npNor = new NinePatch(bitNor, bitNor.getNinePatchChunk(), null);  
  101.         bitAdd = BitmapFactory.decodeResource(getResources(),  
  102.                 R.drawable.tab_add);  
  103.         tabAddWidth = bitAdd.getWidth();  
  104.           
  105.     }  
  106.   
  107.     /**设置当前选中选项的位置*/  
  108.     public void setCurrentSelect(int index) {  
  109.         curSelect = index;  
  110.         invalidate();  
  111.     }  
  112.   
  113.      /** 
  114.       * @see android.view.View#measure(int, int) 
  115.       */  
  116.      @Override  
  117.      protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  118.       setMeasuredDimension(screenWidth, tabHeight);  
  119.      }  
  120.       
  121.     @Override  
  122.     protected void onDraw(Canvas canvas) {  
  123.         super.onDraw(canvas);  
  124.         Paint paint = new Paint();  
  125.         paint.setColor(0xff707070);  
  126.         paint.setTextSize(TEXT_SIZE);  
  127.         /*draw bg*/  
  128.         canvas.drawARGB(0xff, 0xa1, 0x9c, 0xff);  
  129.   
  130.         if(isDraging){  
  131.             int dX = dragCurrentX +  (tabWidth - tabGap) * curSelect;  
  132.               
  133.             /*draw normal tab*/  
  134.             for (int i = tabNum - 1; i >= 0; i--) {  
  135.                 if (i != curSelect) {  
  136.                     int nX = curX + (tabWidth - tabGap) * i ;  
  137.                     if(i > savedClickIndex && savedClickIndex > -1){  
  138.                         nX -= tabWidth - tabGap;  
  139.                     }  
  140.                     if(i > dragSelectIndex && dragSelectIndex > -1){  
  141.                         nX += tabWidth - tabGap;  
  142.                     }  
  143.                     Rect nR = new Rect(nX, 0, nX + tabWidth, tabHeight);  
  144.                     npNor.draw(canvas, nR);  
  145.                       
  146.                     //draw text  
  147.                     canvas.save();  
  148.                     canvas.clipRect(new Rect(nX + TAB_MARGIN, 0, nX + tabWidth - TAB_MARGIN, tabHeight));  
  149.                     canvas.drawText(tabLists.get(i).name, nX + TAB_MARGIN, (tabHeight + TEXT_SIZE) >> 1, paint);  
  150.                     canvas.restore();  
  151.                 }  
  152.             }  
  153.             /*draw shape for above normal tab*/  
  154.             canvas.drawARGB(0x50, 0x00, 0x00, 0x00);  
  155.             /*draw buttom line*/  
  156.             Paint paintShape = new Paint();  
  157.             paintShape.setColor(0x50000000);  
  158.             canvas.drawRect(0, tabHeight - 2, screenWidth, tabHeight, paintShape);  
  159.               
  160.             /*draw current selected tab*/  
  161.             Rect dR = new Rect(dX, 0, dX + tabWidth, tabHeight);  
  162.             npCur.draw(canvas, dR);  
  163.               
  164.             //draw current text  
  165.             paint.setColor(0xff456789);  
  166.             canvas.drawText(tabLists.get(curSelect).name, dX + tabGap, (tabHeight + TEXT_SIZE) >> 1, paint);  
  167.               
  168.             /*draw add button*/  
  169.             int aX =  curX + (tabWidth - tabGap) * tabNum;  
  170.             if(dX + tabWidth > aX)  
  171.                 canvas.drawBitmap(bitAdd, dX + tabWidth - tabGap, 0, paint);  
  172.             else  
  173.                 canvas.drawBitmap(bitAdd, aX, 0, paint);  
  174.         }else{  
  175.             /*draw normal tab*/  
  176.             for (int i = tabNum - 1; i >= 0; i--) {  
  177.                 if (i != curSelect) {  
  178.                     int nX = curX + (tabWidth - tabGap) * i ;  
  179.                     Rect nR = new Rect(nX, 0, nX + tabWidth, tabHeight);  
  180.                     npNor.draw(canvas, nR);  
  181.                       
  182.                     //draw text  
  183.                     canvas.save();  
  184.                     canvas.clipRect(new Rect(nX + TAB_MARGIN, 0, nX + tabWidth - TAB_MARGIN, tabHeight));  
  185.                     canvas.drawText(tabLists.get(i).name, nX + TAB_MARGIN, (tabHeight + TEXT_SIZE) >> 1, paint);  
  186.                     canvas.restore();  
  187.                 }  
  188.             }  
  189.             /*draw shape for above normal tab*/  
  190.             canvas.drawARGB(0x50, 0x00, 0x00, 0x00);  
  191.             /*draw buttom line*/  
  192.             Paint paintShape = new Paint();  
  193.             paintShape.setColor(0x50000000);  
  194.             canvas.drawRect(0, tabHeight - 2, screenWidth, tabHeight, paintShape);  
  195.               
  196.             /*draw current selected tab*/  
  197.             int cX = curX +  (tabWidth - tabGap) * curSelect;  
  198.             Rect cR = new Rect(cX, 0, cX + tabWidth, tabHeight);  
  199.             npCur.draw(canvas, cR);  
  200.               
  201.             //draw current text  
  202.             paint.setColor(0xff456789);  
  203.             canvas.drawText(tabLists.get(curSelect).name, cX + tabGap, (tabHeight + TEXT_SIZE) >> 1, paint);  
  204.               
  205.             /*draw add button*/  
  206.             canvas.drawBitmap(bitAdd, curX + (tabWidth - tabGap) * tabNum, 0, paint);  
  207.         }  
  208.           
  209.     }  
  210.   
  211.     @Override  
  212.     public boolean onTouch(View v, MotionEvent event) {  
  213.            if (mGestureDetector.onTouchEvent(event)) {  
  214.                return true;  
  215.            }  
  216.   
  217.            if(event.getAction() == MotionEvent.ACTION_UP) {  
  218.                if(isDraging ) {  
  219.                    if(dragSelectIndex != curSelect){  
  220.                        if(dragSelectIndex >= tabNum){  
  221.                            dragSelectIndex = tabNum - 1;  
  222.                        }  
  223.                        TabItem tempItem = tabLists.elementAt(curSelect);  
  224.                        tabLists.removeElementAt(curSelect);  
  225.                        tabLists.add(dragSelectIndex, tempItem);  
  226.                    }  
  227.                      
  228.                    float x = event.getX();  
  229.                    curSelect = (int) ((x - curX) / (tabWidth - tabGap));  
  230.                    if(curSelect >= tabNum){  
  231.                        curSelect = tabNum - 1;  
  232.                    }  
  233.                      
  234.                    isDraging  = false;  
  235.                    dragSelectIndex = -1;  
  236.                    dragCurrentX = 0;  
  237.                    dragSavedX = 0;  
  238.                      
  239.                    invalidate();  
  240.                }  
  241.            }  
  242.   
  243.            return false;  
  244.     }  
  245.   
  246.     /**选项点击事件设置*/  
  247.     public void setOnTabItemClickListener(OnTabItemClickListener click) {  
  248.         this.clickListener = click;  
  249.     }  
  250.   
  251.     /**选项点击事件接口*/  
  252.     public interface OnTabItemClickListener {  
  253.         public void onclickListenr(int index);  
  254.     }  
  255.   
  256.     @Override  
  257.     public boolean onDown(MotionEvent event) {  
  258.         float x = event.getX();  
  259.         savedClickIndex = (int) ((x - curX) / (tabWidth - tabGap));  
  260.         if(savedClickIndex == curSelect){  
  261.             isDraging = true;  
  262.             dragSavedX = savedX;  
  263.             clickListener.onclickListenr(savedClickIndex);  
  264.         }  
  265.         return false;  
  266.     }  
  267.   
  268.     @Override  
  269.     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  
  270.             float velocityY) {  
  271.            if(isDraging ) {  
  272.                if(dragSelectIndex != curSelect){  
  273.                    if(dragSelectIndex >= tabNum){  
  274.                        dragSelectIndex = tabNum - 1;  
  275.                    }  
  276.                    TabItem tempItem = tabLists.elementAt(curSelect);  
  277.                    tabLists.removeElementAt(curSelect);  
  278.                    tabLists.add(dragSelectIndex, tempItem);  
  279.                }  
  280.                  
  281.                float x = e2.getX();  
  282.                curSelect = (int) ((x - curX) / (tabWidth - tabGap));  
  283.                if(curSelect >= tabNum){  
  284.                    curSelect = tabNum - 1;  
  285.                }  
  286.   
  287.                isDraging  = false;  
  288.                dragSelectIndex = -1;  
  289.                dragCurrentX = 0;  
  290.                dragSavedX = 0;  
  291.                  
  292.                invalidate();  
  293.            }  
  294.         return true;  
  295.     }  
  296.   
  297.     @Override  
  298.     public void onLongPress(MotionEvent event) {  
  299.     }  
  300.   
  301.     @Override  
  302.     public boolean onScroll(MotionEvent e1, MotionEvent e2,  
  303.             float distanceX, float distanceY) {  
  304.         int tempWidth = (tabWidth - tabGap) * tabNum + tabAddWidth;  
  305.         if(isDraging){  
  306.             //drag  
  307.             int nextX = (int) (dragSavedX + e2.getX() - e1.getX());  
  308.               
  309.             dragSelectIndex = (int) ((e2.getX() - curX) / (tabWidth - tabGap));  
  310.               
  311.             dragCurrentX = nextX;  
  312.               
  313.               
  314.             invalidate();  
  315.         }else{  
  316.             //move  
  317.             int nextX = (int) (savedX - distanceX);  
  318.             if(tempWidth > screenWidth && (nextX <=0  && nextX + tempWidth >= screenWidth)){  
  319.                 curX = nextX;  
  320.                 savedX = curX;  
  321.                 invalidate();  
  322.             }  
  323.         }  
  324.           
  325.         return false;  
  326.     }  
  327.   
  328.     @Override  
  329.     public void onShowPress(MotionEvent event) {  
  330.     }  
  331.   
  332.     @Override  
  333.     public boolean onSingleTapUp(MotionEvent event) {  
  334.         float x = event.getX();  
  335.         int curClickIndex = (int) ((x - curX) / (tabWidth - tabGap));  
  336.         if(savedClickIndex == curClickIndex){  
  337.             if(curClickIndex < tabNum){  
  338.                 setCurrentSelect(curClickIndex);  
  339.                 clickListener.onclickListenr(curClickIndex);  
  340.             }else if(curClickIndex == tabNum){  
  341.                 tabLists.add(new TabItem());  
  342.                 tabNum++;  
  343.                 curX = screenWidth - tabAddWidth - (tabWidth - tabGap) * tabNum;  
  344.                 setCurrentSelect(tabNum - 1);  
  345.                 clickListener.onclickListenr(curClickIndex);  
  346.                 invalidate();  
  347.             }  
  348.         }  
  349.         savedClickIndex = -1;  
  350.         savedX = curX;  
  351.         return false;  
  352.     }  
  353.   
  354. }  

 

 

tabItem类:

 

[java] view plaincopy
 
  1. public class TabItem{  
  2.     public int index;  
  3.     public String name = "New T

自定义tab bar控件 学习资料