下面列出了android.view.View#getFocusedRect ( ) 实例代码,或者点击链接到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}");
}
public void getFocusedRect(Rect r) {
View view = getSelectedView();
if (view == null || view.getParent() != this) {
super.getFocusedRect(r);
return;
}
view.getFocusedRect(r);
offsetDescendantRectToMyCoords(view, r);
}
@Override
public void getFocusedRect(Rect r) {
View view = getSelectedView();
if (view != null && view.getParent() == this) {
// the focused rectangle of the selected view offset into the
// coordinate space of this view.
view.getFocusedRect(r);
offsetDescendantRectToMyCoords(view, r);
} else {
// otherwise, just the norm
super.getFocusedRect(r);
}
}
@Override
public void getFocusedRect(Rect r) {
View view = getSelectedView();
if (view != null && view.getParent() == this) {
// the focused rectangle of the selected view offset into the
// coordinate space of this view.
view.getFocusedRect(r);
offsetDescendantRectToMyCoords(view, r);
} else {
// otherwise, just the norm
super.getFocusedRect(r);
}
}
@Override
public void getFocusedRect(Rect r) {
View view = getSelectedView();
if (view != null && view.getParent() == this) {
// the focused rectangle of the selected view offset into the
// coordinate space of this view.
view.getFocusedRect(r);
offsetDescendantRectToMyCoords(view, r);
} else {
// otherwise, just the norm
super.getFocusedRect(r);
}
}
public void getFocusedRect(Rect paramRect) {
View localView = getSelectedView();
if (localView != null) {
localView.getFocusedRect(paramRect);
offsetDescendantRectToMyCoords(localView, paramRect);
return;
}
super.getFocusedRect(paramRect);
}
/**
* 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;
}
@Override
public void getFocusedRect( Rect r ) {
View view = getSelectedView();
if ( view != null && view.getParent() == this ) {
// the focused rectangle of the selected view offset into the
// coordinate space of this view.
view.getFocusedRect( r );
offsetDescendantRectToMyCoords( view, r );
} else {
// otherwise, just the norm
super.getFocusedRect( r );
}
}
@Override
public void getFocusedRect(Rect r) {
View view = getSelectedView();
if (view != null && view.getParent() == this) {
// the focused rectangle of the selected view offset into the
// coordinate space of this view.
view.getFocusedRect(r);
offsetDescendantRectToMyCoords(view, r);
} else {
// otherwise, just the norm
super.getFocusedRect(r);
}
}
/**
* 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;
}
public static boolean isMotionFocusOnView(View view, MotionEvent event) {
Rect focusBound = new Rect();
view.getFocusedRect(focusBound);
return focusBound.contains((int) event.getX(), (int) event.getY());
}