自定义光标移动

来源:互联网 发布:ug8.5数控编程实例 编辑:程序博客网 时间:2024/05/21 08:48
自定的光标移动,实质是上在程序的顶层有一个透明的View,在Canvas上绘制光标
focus.9.png用一个9宫格的图

当某个View或者其他View  调用requestFocus()就会触发onFocusChanged,覆写该方法
@Overrideprotected 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的可见区域绘制光标
@Overrideprotected 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的大小由动画决定
@Overrideprotected 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();}