自定义光标移动

自定的光标移动,实质是上在程序的顶层有一个透明的View,在Canvas上绘制光标
focus.9.png
用一个9宫格的图

当某个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();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值