亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

安卓TV焦點框處理

2019-11-09 16:07:06
字體:
來源:轉載
供稿:網友

TV焦點

1.自定義屬性

<!--焦點邊框控件屬性--><declare-styleable name="EdgeView">    <attr name="scale" format="float"/>    <attr name="shadow" format="reference"/>    <attr name="border" format="reference"/>    <attr name="host" format="reference"/></declare-styleable>

2.源碼

package com.coship.homefinance.ui;import com.coship.homefinance.R;import android.animation.Animator;import android.animation.AnimatorSet;import android.animation.ObjectAnimator;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.RectF;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.view.View;import android.view.ViewGroup;import android.view.ViewTreeObserver;import android.view.animation.DecelerateInterpolator;/** * EdgeView can make the focus of the more obvious */public class EdgeView extends View implements ViewTreeObserver.OnGlobalFocusChangeListener {    PRivate static final int DEFAULT_TRAN_DUR_ANIM = 200;    private static final float DEFUALT_SCALE = 1.0f;    private View mFocusContent;    private float mScale = 1.05f;    private View mOldFocusView;    private boolean mAnimEnabled = true;    private Drawable mDrawableShadow;    private Drawable mDrawableBorder;    private int mHostViewId;    public EdgeView(Context context) {        this(context, null, 0);    }    public EdgeView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public EdgeView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        TypedArray tArray = context.obtainStyledAttributes(attrs, R.styleable.EdgeView);// 獲取配置屬性        mDrawableBorder = tArray.getDrawable(R.styleable.EdgeView_border);        mDrawableShadow = tArray.getDrawable(R.styleable.EdgeView_shadow);        mScale = tArray.getFloat(R.styleable.EdgeView_scale, 1.1f);        mHostViewId = tArray.getResourceId(R.styleable.EdgeView_host, android.R.id.content);        tArray.recycle();        setFocusable(false);    }    @Override    protected void onFinishInflate() {        super.onFinishInflate();    }    @Override    protected void onAttachedToWindow() {        super.onAttachedToWindow();        ViewGroup viewGroup = (ViewGroup) getParent();        if (viewGroup != null) {            this.mFocusContent = viewGroup.findViewById(mHostViewId);            if (this.mFocusContent != null) {                mFocusContent.getViewTreeObserver().addOnGlobalFocusChangeListener(this);            }        }    }    @Override    protected void onDetachedFromWindow() {        super.onDetachedFromWindow();        if (this.mFocusContent != null) {            this.mFocusContent.getViewTreeObserver().removeOnGlobalFocusChangeListener(this);        }    }    @Override    protected void onDraw(Canvas canvas) {        canvas.save();        drawShadow(canvas);        drawBorder(canvas);        canvas.restore();        super.onDraw(canvas);    }    //draw shadow    protected void drawShadow(Canvas canvas) {        if (mDrawableShadow != null) {            RectF shadowPaddingRect = new RectF(10, 10, 10, -55);            int width = getWidth();            int height = getHeight();            Rect padding = new Rect();            mDrawableShadow.getPadding(padding);            //            int left = (int) Math.rint(shadowPaddingRect.left);            int right = (int) Math.rint(shadowPaddingRect.right);            int bottom = (int) Math.rint(shadowPaddingRect.bottom);            int top = (int) Math.rint(shadowPaddingRect.top);            //            mDrawableShadow.setBounds(-padding.left - (left), -padding.top - (top),                    width + padding.right + (right),                    height + padding.bottom + (bottom));            mDrawableShadow.draw(canvas);        }    }    //draw Border    protected void drawBorder(Canvas canvas) {        if (mDrawableBorder != null) {            RectF paddingRect = new RectF(0, 0, 0, 0);            int width = getWidth();            int height = getHeight();            Rect padding = new Rect();            // 邊框的繪制.            mDrawableBorder.getPadding(padding);            //            int left = (int) Math.rint(paddingRect.left);            int right = (int) Math.rint(paddingRect.right);            int bottom = (int) Math.rint(paddingRect.bottom);            int top = (int) Math.rint(paddingRect.top);            //            mDrawableBorder.setBounds(-padding.left - (left), -padding.top - (top),                    width + padding.right + (right), height + padding.bottom + (bottom));            mDrawableBorder.draw(canvas);        }    }    public void flyWhiteBorder(final View focusView) {        flyWhiteBorder(focusView, EdgeView.this, mScale, mScale);    }    private void flyWhiteBorder(final View focusView, View oldFocus, float scaleX, float scaleY) {        int newWidth;        int newHeight;        float oldTranslationX,oldTranslationY;        float newTranslationX,newTranslationY;        if (focusView != null) {            int[] rectNew = new int[2];     //新焦點框在屏幕的位置            focusView.getLocationOnScreen(rectNew);            oldTranslationX = oldFocus.getTranslationX();            oldTranslationY = oldFocus.getTranslationY();            newTranslationX = rectNew[0];            newTranslationY = rectNew[1];            newWidth = (int) (Math.rint(focusView.getWidth() * scaleX));            newHeight = (int) (Math.rint(focusView.getHeight() * scaleY));            ViewGroup.LayoutParams params = getLayoutParams();            params.width = newWidth;            params.height = newHeight;            setLayoutParams(params);            ObjectAnimator transAnimatorX = ObjectAnimator.ofFloat(oldFocus, "translationX", oldTranslationX, newTranslationX);            ObjectAnimator transAnimatorY = ObjectAnimator.ofFloat(oldFocus, "translationY", oldTranslationY, newTranslationY);            AnimatorSet mAnimatorSet = new AnimatorSet();            mAnimatorSet.playTogether(transAnimatorX, transAnimatorY);            mAnimatorSet.setInterpolator(new DecelerateInterpolator(1));            mAnimatorSet.setDuration(DEFAULT_TRAN_DUR_ANIM);            //添加動畫監聽            mAnimatorSet.addListener(new Animator.AnimatorListener() {                @Override                public void onAnimationStart(Animator animation) {                    if (getVisibility() != VISIBLE) {                        setVisibility(VISIBLE);                    }                }                @Override                public void onAnimationEnd(Animator animation) {                }                @Override                public void onAnimationCancel(Animator animation) {                }                @Override                public void onAnimationRepeat(Animator animation) {                }            });            mAnimatorSet.start();        }    }    @Override    public void onGlobalFocusChanged(final View oldFocus, final View newFocus) {        if (!mAnimEnabled)            return;        if (mOldFocusView != null) {            mOldFocusView.animate().scaleX(DEFUALT_SCALE).scaleY(DEFUALT_SCALE).setDuration(DEFAULT_TRAN_DUR_ANIM).start();        }        if(!isContain(mFocusContent, newFocus)){            setVisibility(GONE);            return;        }        if (newFocus != null ) {            mOldFocusView = newFocus; // 4.3以下需要自己保存.            newFocus.bringToFront();            newFocus.animate().scaleX(mScale).scaleY(mScale).setDuration(DEFAULT_TRAN_DUR_ANIM).start();            postDelayed(new Runnable() {                @Override                public void run() {                    flyWhiteBorder(newFocus);//頁面切換時view的位置更新慢導致計算不正確                }            },DEFAULT_TRAN_DUR_ANIM);        }    }    private boolean isContain(View view, View viewChild){        if(view == viewChild){            return true;        } else if(view instanceof ViewGroup){            ViewGroup viewGroup = (ViewGroup)view;            int count = viewGroup.getChildCount();            for (int i = 0; i < count; i++) {                View v = viewGroup.getChildAt(i);                if(isContain(v, viewChild)){                    return true;                }            }        }        return false;    }}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人成网站777色婷婷| 精品一区二区亚洲| 国产精品美女久久久免费| 亚洲免费视频一区二区| 国产精品九九久久久久久久| 中文字幕亚洲欧美在线| 久久久成人精品视频| 亚洲аv电影天堂网| 97国产成人精品视频| 亚洲精品一区中文| 国产日本欧美一区二区三区| 国产在线视频欧美| 北条麻妃久久精品| 日韩电影中文 亚洲精品乱码| 日本91av在线播放| 日韩女优人人人人射在线视频| 奇米4444一区二区三区| 欧美色图在线视频| 亚洲二区中文字幕| 91天堂在线视频| 国产日韩精品电影| 欧美一区二区视频97| 欧美成人全部免费| 亚洲精品成人网| 91夜夜揉人人捏人人添红杏| 午夜欧美不卡精品aaaaa| 91精品视频在线看| 国产精品自拍小视频| 最近2019好看的中文字幕免费| 欧美一级片在线播放| 欧美高清视频在线观看| 亚洲国产私拍精品国模在线观看| 国产69精品99久久久久久宅男| 久久视频在线看| 欧美成人第一页| 国产69久久精品成人| 国产美女搞久久| 456国产精品| 亚洲资源在线看| 欧美日韩午夜剧场| 国产伊人精品在线| 亚洲午夜久久久影院| 奇米4444一区二区三区| 欧美视频在线观看免费网址| 精品高清一区二区三区| 国产精品欧美激情在线播放| 国产91亚洲精品| 久久久久久av| 日韩电影中文字幕在线观看| 美日韩丰满少妇在线观看| 日本久久91av| 国产精品久久久久91| 亚洲天堂男人天堂女人天堂| 中文字幕国产精品| 亚洲视频在线观看视频| 国产精品v片在线观看不卡| 成人黄色av免费在线观看| 日本成人激情视频| 久久视频精品在线| 91欧美精品午夜性色福利在线| 亚洲人高潮女人毛茸茸| 欧美精品少妇videofree| 日本精品一区二区三区在线播放视频| 精品爽片免费看久久| 欧美另类暴力丝袜| 亚洲xxx视频| 国产精品美女久久久久av超清| 欧美一区二粉嫩精品国产一线天| 中文字幕日韩欧美在线| 亚洲影院色在线观看免费| 26uuu另类亚洲欧美日本一| 欧美亚洲免费电影| 国产欧美日韩视频| 亚洲一区二区福利| 中文字幕久热精品在线视频| 精品久久久一区二区| 91免费视频国产| 最近2019中文字幕在线高清| 日韩av观看网址| 国语自产精品视频在免费| 亚洲国产精品成人av| 91久久久久久久一区二区| 欧美第一黄网免费网站| 精品色蜜蜜精品视频在线观看| 亚洲毛片在线看| 国产精品久久久久久久app| 国内久久久精品| 日韩精品中文字幕在线| 一区二区三区四区在线观看视频| 精品成人av一区| 亚洲精品美女免费| 亚洲一区二区福利| 91精品国产自产在线老师啪| 亚洲一区二区免费在线| 日韩欧美a级成人黄色| 亚洲有声小说3d| 91成人在线视频| 欧美性jizz18性欧美| 久久久久日韩精品久久久男男| 91久久久久久久一区二区| 日韩电影中文字幕在线观看| 夜色77av精品影院| 国产精品免费视频久久久| 国产精品视频地址| 91久久在线播放| 精品激情国产视频| 亚洲欧洲日产国码av系列天堂| 国产福利精品视频| 91国产高清在线| 91精品国产91久久久久久| 一区二区三区久久精品| 欧美在线影院在线视频| 成人网址在线观看| 国产精品9999| 欧美日韩激情美女| 社区色欧美激情 | 国产不卡av在线免费观看| 国产在线观看91精品一区| 在线成人激情黄色| 91九色视频导航| 麻豆一区二区在线观看| 精品视频偷偷看在线观看| 深夜福利国产精品| 九九精品在线播放| 国产精品网站入口| 久久精视频免费在线久久完整在线看| 欧美极品欧美精品欧美视频| 91精品久久久久久久| 一区二区在线视频播放| 日韩在线精品视频| 午夜精品久久久久久久久久久久久| 久久久久久高潮国产精品视| 欧美视频在线免费| 精品国产电影一区| 国产精品久久久久久久久久久不卡| 亚洲成人精品久久久| 日韩av资源在线播放| 久久免费视频网| 日韩成人在线免费观看| 欧美日韩免费区域视频在线观看| 国产亚洲成av人片在线观看桃| 欧美高跟鞋交xxxxxhd| 精品少妇一区二区30p| 欧美久久精品午夜青青大伊人| 97在线精品国自产拍中文| 亚洲欧美三级伦理| 亚洲人永久免费| 中文字幕在线日韩| 国产精品久久久久久久天堂| 黄色一区二区在线观看| 色七七影院综合| 国产亚洲欧洲高清| 亚洲欧美精品一区二区| 黑人巨大精品欧美一区二区三区| 日韩激情第一页| 久久中文精品视频| 久久免费在线观看| 欧美日韩在线免费观看| 日日噜噜噜夜夜爽亚洲精品| 精品久久久久国产| 亚洲国产精品人人爽夜夜爽| 久久精品国产电影| 91老司机在线| 国产成人精品视频在线|