下面列出了android.view.View#findFocus ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
private boolean handleHorizontalFocusWithinListItem(int direction) {
if (direction == 33 || direction == 130) {
int numChildren = getChildCount();
if (this.mItemsCanFocus && numChildren > 0 && this.mSelectedPosition != -1) {
View selectedView = getSelectedView();
if (selectedView != null && selectedView.hasFocus() && (selectedView instanceof ViewGroup)) {
View currentFocus = selectedView.findFocus();
View nextFocus = FocusFinder.getInstance().findNextFocus((ViewGroup) selectedView, currentFocus, direction);
if (nextFocus != null) {
currentFocus.getFocusedRect(this.mTempRect);
offsetDescendantRectToMyCoords(currentFocus, this.mTempRect);
offsetRectIntoDescendantCoords(nextFocus, this.mTempRect);
if (nextFocus.requestFocus(direction, this.mTempRect)) {
return true;
}
}
View globalNextFocus = FocusFinder.getInstance().findNextFocus((ViewGroup) getRootView(), currentFocus, direction);
if (globalNextFocus != null) {
return isViewAncestorOf(globalNextFocus, this);
}
}
}
return false;
}
throw new IllegalArgumentException("direction must be one of {View.FOCUS_UP, View.FOCUS_DOWN}");
}
/**
* 获取 View 里获取焦点的 View
* @param view {@link View}
* @return {@link View}
*/
public static View findFocus(final View view) {
if (view != null) {
return view.findFocus();
}
return null;
}
/**
* To avoid horizontal focus searches changing the selected item, we manually focus search within the selected item (as
* applicable), and prevent focus from jumping to something within another item.
*
* @param direction
* one of {View.FOCUS_LEFT, View.FOCUS_RIGHT}
* @return Whether this consumes the key event.
*/
private boolean handleHorizontalFocusWithinListItem( int direction ) {
// TODO: implement this
if ( direction != View.FOCUS_LEFT && direction != View.FOCUS_RIGHT ) {
throw new IllegalArgumentException( "direction must be one of"
+ " {View.FOCUS_LEFT, View.FOCUS_RIGHT}" );
}
final int numChildren = getChildCount();
if ( mItemsCanFocus && numChildren > 0 && mSelectedPosition != INVALID_POSITION ) {
final View selectedView = getSelectedView();
if ( selectedView != null && selectedView.hasFocus() &&
selectedView instanceof ViewGroup ) {
final View currentFocus = selectedView.findFocus();
final View nextFocus = FocusFinder.getInstance().findNextFocus(
(ViewGroup) selectedView, currentFocus, direction );
if ( nextFocus != null ) {
// do the math to get interesting rect in next focus' coordinates
currentFocus.getFocusedRect( mTempRect );
offsetDescendantRectToMyCoords( currentFocus, mTempRect );
offsetRectIntoDescendantCoords( nextFocus, mTempRect );
if ( nextFocus.requestFocus( direction, mTempRect ) ) {
return true;
}
}
// we are blocking the key from being handled (by returning true)
// if the global result is going to be some other view within this
// list. this is to acheive the overall goal of having
// horizontal d-pad navigation remain in the current item.
final View globalNextFocus = FocusFinder.getInstance().findNextFocus(
(ViewGroup) getRootView(), currentFocus, direction );
if ( globalNextFocus != null ) {
return isViewAncestorOf( globalNextFocus, this );
}
}
}
return false;
}
/**
* To avoid horizontal focus searches changing the selected item, we
* manually focus search within the selected item (as applicable), and
* prevent focus from jumping to something within another item.
* @param direction one of {View.FOCUS_LEFT, View.FOCUS_RIGHT}
* @return Whether this consumes the key event.
*/
private boolean handleHorizontalFocusWithinListItem(int direction) {
if (direction != View.FOCUS_LEFT && direction != View.FOCUS_RIGHT) {
throw new IllegalArgumentException("direction must be one of"
+ " {View.FOCUS_LEFT, View.FOCUS_RIGHT}");
}
final int numChildren = getChildCount();
if (mItemsCanFocus && numChildren > 0 && mSelectedPosition != INVALID_POSITION) {
final View selectedView = getSelectedView();
if (selectedView != null && selectedView.hasFocus() &&
selectedView instanceof ViewGroup) {
final View currentFocus = selectedView.findFocus();
final View nextFocus = FocusFinder.getInstance().findNextFocus(
(ViewGroup) selectedView, currentFocus, direction);
if (nextFocus != null) {
// do the math to get interesting rect in next focus' coordinates
Rect focusedRect = mTempRect;
if (currentFocus != null) {
currentFocus.getFocusedRect(focusedRect);
offsetDescendantRectToMyCoords(currentFocus, focusedRect);
offsetRectIntoDescendantCoords(nextFocus, focusedRect);
} else {
focusedRect = null;
}
if (nextFocus.requestFocus(direction, focusedRect)) {
return true;
}
}
// we are blocking the key from being handled (by returning true)
// if the global result is going to be some other view within this
// list. this is to acheive the overall goal of having
// horizontal d-pad navigation remain in the current item.
final View globalNextFocus = FocusFinder.getInstance().findNextFocus(
(ViewGroup) getRootView(), currentFocus, direction);
if (globalNextFocus != null) {
return isViewAncestorOf(globalNextFocus, this);
}
}
}
return false;
}
private boolean arrowScrollImpl(int direction) {
if (getChildCount() <= 0) {
return false;
}
boolean needToRedraw;
View focused;
View selectedView = getSelectedView();
int selectedPos = this.mSelectedPosition;
int nextSelectedPosition = lookForSelectablePositionOnScreen(direction);
int amountToScroll = amountToScroll(direction, nextSelectedPosition);
ArrowScrollFocusResult focusResult = this.mItemsCanFocus ? arrowScrollFocused(direction) : null;
if (focusResult != null) {
nextSelectedPosition = focusResult.getSelectedPosition();
amountToScroll = focusResult.getAmountToScroll();
}
if (focusResult != null) {
needToRedraw = true;
} else {
needToRedraw = false;
}
if (nextSelectedPosition != -1) {
boolean z;
if (focusResult != null) {
z = true;
} else {
z = false;
}
handleNewSelectionChange(selectedView, direction, nextSelectedPosition, z);
setSelectedPositionInt(nextSelectedPosition);
setNextSelectedPositionInt(nextSelectedPosition);
selectedView = getSelectedView();
selectedPos = nextSelectedPosition;
if (this.mItemsCanFocus && focusResult == null) {
focused = getFocusedChild();
if (focused != null) {
focused.clearFocus();
}
}
needToRedraw = true;
checkSelectionChanged();
}
if (amountToScroll > 0) {
if (direction != 33) {
amountToScroll = -amountToScroll;
}
scrollListItemsBy(amountToScroll);
needToRedraw = true;
}
if (this.mItemsCanFocus && focusResult == null && selectedView != null && selectedView.hasFocus()) {
focused = selectedView.findFocus();
if (!isViewAncestorOf(focused, this) || distanceToView(focused) > 0) {
focused.clearFocus();
}
}
if (!(nextSelectedPosition != -1 || selectedView == null || isViewAncestorOf(selectedView, this))) {
selectedView = null;
hideSelector();
this.mResurrectToPosition = -1;
}
if (!needToRedraw) {
return false;
}
if (selectedView != null) {
positionSelector(selectedPos, selectedView);
this.mSelectedLeft = selectedView.getLeft();
}
if (!awakenScrollBars()) {
invalidate();
}
invokeOnItemScrollListener();
return true;
}