需要的效果為:螢幕上固定幾行幾列的單元格,當焦點移動到某乙個item時有乙個焦點框的動畫效果,焦點針對是item中的imageview的大小,向上或者向下滑動時也需要動畫效果。
遇到的問題是,當快速移動時,容易出現偏差。
**結構
最主要的是三個類:
1.basegridview
package com.hm.gridviewtest;
import android.content.context;
import android.util.attributeset;
import android.widget.gridview;
public class basegridview extends gridview
basegridview(context context, attributeset attrs)
basegridview(context context, attributeset attrs, int defstyle)
@override
public void setonitemselectedlistener(onitemselectedlistener listener)
onitemselectedlistener getonbaseitemselectedlistener()
void setonbaseitemselectedlistener(onitemselectedlistener listener)
}
這個類很簡單,而且是同包訪問許可權,最主要的方法是setonitemselectedlistener,getonbaseitemselectedlistener,setonbaseitemselectedlistener,當外部呼叫的setonitemselectedlistener時其實沒有真正的設定監聽,監聽主要供basegridviewcontainer來處理滑動
2.basegridviewcontainer
這個類是最關鍵的,處理滑動,控制basegridview的大小等等。
package com.hm.gridviewtest;
import android.content.context;
import android.content.res.typedarray;
import android.graphics.color;
import android.graphics.rect;
import android.graphics.drawable.colordrawable;
import android.util.attributeset;
import android.util.log;
import android.view.keyevent;
import android.view.view;
import android.widget.abslistview.onscrolllistener;
import android.widget.abslistview;
import android.widget.adapterview;
import android.widget.gridview;
import android.widget.relativelayout;
import android.widget.adapterview.onitemselectedlistener;
public class basegridviewcontainer extends relativelayout
public basegridviewcontainer(context context, attributeset attrs)
public basegridviewcontainer(context context, attributeset attrs,
int defstyle)
public gridview getgridview()
@override
protected void onmeasure(int widthmeasurespec, int heightmeasurespec)
// 此處是真正的監聽處理
onitemselectedlistener mselectedlistener = new onitemselectedlistener()
// 焦點框滑動動畫方法
animateborder(v != null);
// 留給呼叫者的監聽
onitemselectedlistener l = mgridview
.getonbaseitemselectedlistener();
if (l != null)
} @override
public void onnothingselected(adapterview> parent)
} };
// 滑動監聽,判斷是否滑動,以及滑動停止時開始焦點框動畫
onscrolllistener mscrolllistener = new onscrolllistener()
} @override
public void onscroll(abslistview view, int firstvisibleitem,
int visibleitemcount, int totalitemcount)
}; // 處理焦點框的動畫
private void animateborder(boolean animated)
log.i(tag, "animateborder animated = " + animated);
view v = mgridview.getselectedview();
mborderview.setvisibility(visible);
if (v instanceof basegriditemview)
if (animated) else
} if (v == null)
}, 50);
} }@override
public boolean dispatchkeyevent(keyevent event)
return super.dispatchkeyevent(event);
}}
3.basegriditemview
這個類是每乙個grid子項,它有乙個基類方法,計算當前焦點框的區域。
package com.hm.gridviewtest;
import android.content.context;
import android.graphics.rect;
import android.util.attributeset;
public abstract class basegriditemview extends baseitemview
public basegriditemview(context context, attributeset attrs)
public basegriditemview(context context, attributeset attrs, int defstyle)
public abstract rect getborderrect();
}
例如griditemview計算item中iamgeview的所在區域。
@override
public rect getborderrect() while (parent != this);
rect.left += getleft();
rect.top += gettop();
rect.right = rect.left + width;
rect.bottom = rect.top + height;
} return rect;
}
TV端使用RecyclerView時遇到的問題
問題原因 item的布局使用了match parent,修改為wrap content後正常顯示 解決方法 設定recyclerview的android focusable false,然後讓item的根布局focusable true。我怎麼這麼聰明,哈哈哈 在自定義的recyclerview.a...
GridView使用問題
1 gridview 新增合計行!前提 設定屬性showfooter true 方法一 使用sql查詢統計出合計值,在繫結gridview時讓其結果賦於乙個datatable 全域性變數 然後在rowdatabound事件中 參考例項 在gridview中,不同條件的行顯示不同的顏色 在gridvi...
putty使用 在linux中使用vim
要想富,先修路,要想使用vim,先安裝包,這是 vim官網。開始安裝vim rpm qa grep vim 檢視vim命令的軟體包 yum install y vim 下面這幅是乙個經典的vim命令圖。vim鍵盤圖 vim有三種模式 命令大全 下面是常用的一些命令 包括游標移動 複製 貼上和搜尋 替...