GridView 使用在TV或者盒子上

2021-06-28 06:42:30 字數 4084 閱讀 7396

需要的效果為:螢幕上固定幾行幾列的單元格,當焦點移動到某乙個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有三種模式 命令大全 下面是常用的一些命令 包括游標移動 複製 貼上和搜尋 替...