package com.tv.ui.metro.view; import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.View; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import com.tv.ui.metro.R; public class MetroCursorView extends View { private View mFocusView; private View mUnFocusView; private int[] mFocusLocation = new int[2]; private int[] mLocation = new int[2]; private Drawable mDrawableWhite; private Drawable mDrawableShadow; private float mScaleUp = 1.0f; private float mScaleDown = 1.1f; private Paint mPaint = new Paint(); private Rect mRect = new Rect(); private boolean mMirror = false; ObjectAnimator anim = ObjectAnimator.ofFloat(this, "ScaleUp", new float[] { 1.0F, 1.1F }).setDuration(getResources().getInteger(R.integer.scale_up_duration)); ObjectAnimator anim1 = ObjectAnimator.ofFloat(this, "ScaleDown", new float[] { 1.1F, 1.0F }).setDuration(getResources().getInteger(R.integer.scale_down_duration)); ObjectAnimator animShime = ObjectAnimator.ofFloat(this, "ScaleUp", new float[] { 1.1F, 1.15F, 1.1F }).setDuration(150); ObjectAnimator animUpdate = ObjectAnimator.ofFloat(this, "Update", new float[] { 1.0F, 1.0F }).setDuration(getResources().getInteger(R.integer.update_duration)); public MetroCursorView(Context context) { super(context); init(context); } public MetroCursorView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } void init(Context context){ mDrawableWhite = getResources().getDrawable(R.drawable.item_highlight); mDrawableShadow = getResources().getDrawable(R.drawable.item_shadow); mPaint.setColor(0xff000000); anim.setInterpolator(new DecelerateInterpolator()); anim1.setInterpolator(new DecelerateInterpolator()); animShime.setInterpolator(new AccelerateInterpolator()); } @Override protected void onDraw(Canvas canvas) { drawCursorView(canvas,mFocusView,mScaleUp, true); //if(anim1.isRunning()) { //drawCursorView(canvas,mUnFocusView,mScaleDown, false); } } public void drawCursorView(Canvas canvas, View view, float scale, boolean focus){ if(view!=null){ canvas.save(); if (null == mLocation) { mLocation = new int[2]; } if (null == mFocusLocation) { mFocusLocation = new int[2]; } getLocationInWindow(mLocation); view.getLocationInWindow(mFocusLocation); int width = view.getWidth(); int height = view.getHeight(); if(view instanceof MirrorItemView ){ height = ((MirrorItemView)view).getContentView().getHeight(); } int left = (int)(mFocusLocation[0]-mLocation[0]-width*(scale-1)/2); int top = (int)(mFocusLocation[1]-mLocation[1]-height*(scale-1)/2); canvas.translate(left, top); canvas.scale(scale, scale); //view.draw(canvas); if(view instanceof MirrorItemView ){ Bitmap bmp = ((MirrorItemView)view).getReflectBitmap(); if(bmp != null) canvas.drawBitmap(bmp, 0, height, null); } if(focus){ Rect padding = new Rect(); mDrawableShadow.getPadding(padding); mDrawableShadow.setBounds(-padding.left, -padding.top, width+padding.right, height+padding.bottom); mDrawableShadow.setAlpha((int)(255*(scale-1)*10)); mDrawableShadow.draw(canvas); mDrawableWhite.getPadding(padding); mDrawableWhite.setBounds(-padding.left-1, -padding.top-1, width+padding.right+1, height+padding.bottom+1); mDrawableWhite.setAlpha((int)(255*(scale-1)*10)); mDrawableWhite.draw(canvas); } view.draw(canvas); canvas.restore(); } } public void setFocusView(View view){ if(mFocusView != view){ mFocusView = view; //mMirror = mirror; mScaleUp = 1.0f; //anim.setStartDelay(50); anim.start(); animUpdate.start(); if(view instanceof MirrorItemView ){ ((MirrorItemView)view).setReflection(false); view.invalidate(); } } } public void showIndicator(){ animShime.start(); } public void setUnFocusView(View view){ mFocusView = null; if(view instanceof MirrorItemView ){ ((MirrorItemView)view).setReflection(true); view.invalidate(); } if(mUnFocusView != view){ mUnFocusView = view; anim1.start(); } invalidate(); } /** * 该方法不能被混淆 * @param scale */ public void setScaleUp(float scale){ mScaleUp = scale; invalidate(); } public void setScaleDown(float scale){ mScaleDown = scale; invalidate(); } public void setUpdate(float scale){ invalidate(); } }