前兩天在些專案的時候碰到常用的GridView要實現一些分割線,之前就是用本方法利用listView和Item的背景顏色的不同線顯示分割線。這是最low的一種做法。於是我就簡單的寫了一個自定義的 GridView。
我們可以先看List怎麼設定分割線
android:divider
android:dividerHeight複製程式碼
然而我們都知道 GirdView預設是沒有網格線的,那麼該如何設定呢?
如何設定GridView的分割線
- 第一種通過設定背景顏色的不同來充當divier
- 首先設定GridView的背景顏色
- 設定item的背景顏色
- 設定item的寬高
<GridView
android:id="@+id/mgv_griview2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:background="@color/black3"
android:horizontalSpacing="1dp"
android:verticalSpacing="1dp"
android:padding="2dp"
android:numColumns="3" >複製程式碼
佈局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:gravity="center"
android:layout_margin="5dp"
android:layout_height="match_parent">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@drawable/ic_launcher"
android:id="@+id/myitem_gv"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_marginTop="10dp"
android:text="圖片"/>
</LinearLayout>複製程式碼
自定義View來解決GridView的分割線
效果圖
**
* 類功能描述:</br>
* Created by Administrator on 2017/2/19 0018.
* 部落格地址: http://blog.csdn.net/androidstarjack
* @author androidstar
* @version 1.0 </p> 修改時間:</br> 修改備註:</br>
* 公眾號: 終端研發部
*/
public class MyGridView extends GridView {
/**
* 預設的分割線的顏色
* 也可以在佈局中設定
*/
private int diverColor = R.color.color1;
/**
* 預設的分割線的高度
* 也可以在佈局中設定
*/
private int diverHeight = 1;
/**
* 所使用的畫筆
*/
private Paint paint;
private Context context;
public MyGridView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context =context;
TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.gv_acusttrs);
diverHeight = (int) typedArray.getDimension(R.styleable.gv_acusttrs_divierHeight,10);
diverColor = typedArray.getResourceId(R.styleable.gv_acusttrs_divierColor,R.drawable.editext_slelect_black4);
typedArray.recycle();
paint = new Paint();
paint.setColor(ContextCompat.getColor(context,diverColor));
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
paint.setStrokeWidth(diverHeight);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
/**
* 動態修改預設的分割線的顏色
*/
public void setDiverColor(int diverColor){
this.diverColor = diverColor;
invalidate();
}
/**
* 動態修改預設的分割線的顏色
*/
public void setDiverHeight(int diverHeight){
this.diverHeight = diverHeight;
invalidate();
}
/**
*
* @param canvas
*/
/* @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Rect rect = new Rect();
rect.left = DensityUtil.getScreenIntWidth(context) / 4;
rect.top = DensityUtil.getScreenIntHeight(context) / 4;
rect.right = DensityUtil.getScreenIntWidth(context)/ 4 * 3;
rect.bottom = DensityUtil.getScreenIntHeight(context)/ 4 * 3;
canvas.drawRect(rect,paint);
}*/
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
View localView1 = getChildAt(0);//得到第一個view
int column = getWidth() / localView1.getWidth();//列數
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
View cellView = getChildAt(i);
if ((i + 1) % column == 0) {//每一行最後一個
canvas.drawLine(cellView.getLeft(), cellView.getBottom(), cellView.getRight(), cellView.getBottom(), paint);
} else if ((i + 1) > (childCount - (childCount % column))) {//最後一行的item
canvas.drawLine(cellView.getRight(), cellView.getTop(), cellView.getRight(), cellView.getBottom(), paint);
} else {
canvas.drawLine(cellView.getRight(), cellView.getTop(), cellView.getRight(), cellView.getBottom(), paint);
canvas.drawLine(cellView.getLeft(), cellView.getBottom(), cellView.getRight(), cellView.getBottom(), paint);
}
}
}
}複製程式碼
我們都知道這裡用到了dispatchDraw方法
/**
* Called by draw to draw the child views. This may be overridden
* by derived classes to gain control just before its children are drawn
* (but after its own view has been drawn).
* @param canvas the canvas on which to draw the view
*/
protected void dispatchDraw(Canvas canvas) {
}複製程式碼
- View元件的繪製會呼叫draw(Canvas canvas)方法,draw過程中主要是先畫Drawable背景,對 drawable呼叫setBounds()然後是draw(Canvas c)方法.有點注意的是背景drawable的實際大小會影響view元件的大小,drawable的實際大小通過getIntrinsicWidth()和getIntrinsicHeight()獲取,當背景比較大時view元件大小等於背景drawable的大小
畫完背景後,draw過程會呼叫onDraw(Canvas canvas)方法,然後就是dispatchDraw(Canvas canvas)方法, - dispatchDraw()主要是分發給子元件進行繪製,我們通常定製元件的時候重寫的是onDraw()方法。值得注意的是ViewGroup容器元件的繪製,當它沒有背景時直接呼叫的是dispatchDraw()方法, 而繞過了draw()方法,當它有背景的時候就呼叫draw()方法,而draw()方法裡包含了dispatchDraw()方法的呼叫。因此要在ViewGroup上繪製東西的時候往往重寫的是dispatchDraw()方法而不是onDraw()方法,或者自定製一個Drawable,重寫它的draw(Canvas c)和 getIntrinsicWidth(),
相關demo現在地址:
MyGridViewApplication.rar
相信自己,沒有做不到的,只有想不到的
如果你覺得此文對您有所幫助,歡迎入群 QQ交流群 :232203809
微信公眾號:終端研發部