自定的光标移动,实质是上在程序的顶层有一个透明的View,在Canvas上绘制光标
用一个9宫格的图
当某个View或者其他View 调用requestFocus()就会触发onFocusChanged,覆写该方法
在onDraw()方法中主要是获取到最顶层的View,然后调用该View去在当前view的可见区域绘制光标
此时光标View要做动画去改变“光标”位置,viewRect用来存上一次光标rect
在ondraw的改变canvans的位置将drawable绘制在canvas上,drawable的大小由动画决定
如果要加焦点动画需要定一个DrawableHolder
创建Animation,
createAnimation(Rect src, Recd dest)
利用PropertyValuesHolder,ObjectAnimator 创建动画,DrawableHolder的会保存每帧动画的数据。然后invalidate()就可以在ondraw
给Animation添加继承 ValueAnimator.AnimatorUpdateListener不断绘制
![]() |
focus.9.png |
当某个View或者其他View 调用requestFocus()就会触发onFocusChanged,覆写该方法
@Override
protected void onFocusChanged(boolean gainFocus, int direction,
Rect previouslyFocusedRect) {
if (gainFocus) {
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
if(isRequestFocused){
return;
}
isRequestFocused = true;
} else {
isClearFocus = true;
}
invalidate();
}
在onDraw()方法中主要是获取到最顶层的View,然后调用该View去在当前view的可见区域绘制光标
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Context context = getContext();
if (context instanceof MainPageActivity) {
//从Activity中获取光标View
HighlightView highlightView = ((MainPageActivity) context).getHighlightView();
if (isRequestFocused) {//需要光标移动到该View
Rect rect = new Rect();
if (this.getGlobalVisibleRect(rect)) {
//绘制光标View
highlightView.drawButtonHighlight(rect);
isRequestFocused = false;
}
} else if(isClearFocus){//清除光标
highlightView.clearButtonHighlight();
isClearFocus = false;
}
}
}
此时光标View要做动画去改变“光标”位置,viewRect用来存上一次光标rect
Rect highlightRect = new Rect();
//这个方法用于返回padding,这个padding其实表示的是控件的content的padding
if (!highlightDrawable.getPadding(highlightRect)) {
throw new IllegalStateException("Highlight drawable has to have padding");
}
在ondraw的改变canvans的位置将drawable绘制在canvas上,drawable的大小由动画决定
@Override
protected void onDraw(Canvas canvas) {
canvas.save();
canvas.translate(drawableHolder.getX(), drawableHolder.getY());
drawableHolder.getDrawable().draw(canvas);
canvas.restore();
}
如果要加焦点动画需要定一个DrawableHolder
public class DrawableHolder {
private float x = 0, y = 0;
private NinePatchDrawable drawable;
//set() get()
.....
}
创建Animation,
createAnimation(Rect src, Recd dest)
利用PropertyValuesHolder,ObjectAnimator 创建动画,DrawableHolder的会保存每帧动画的数据。然后invalidate()就可以在ondraw
给Animation添加继承 ValueAnimator.AnimatorUpdateListener不断绘制
public void onAnimationUpdate(ValueAnimator animation) {
invalidate();
}