实现GridView选中放大 Listview的选中

GridView选中放大, 主要是在GridView中添加了一个新的FrameLayout, 然后copy  GridView item的镜像出来,绘制到FrameLayout中去





package com.kookong.tv.view;

import com.kookong.tv.R;

import android.animation.ObjectAnimator;
import android.content.Context;
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;

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);
    }
    
    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();
            
            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);
            
            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;
            mScaleUp = 1.0f;
            anim.start();
            animUpdate.start();

        }
    }
    
    public void showIndicator() {
        animShime.start();
    }
    
    public void setUnFocusView(View view) {
        mFocusView = null;
        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();
    }
    
}






<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" >

        <LinearLayout
            android:id="@+id/tvwallv2_left_nav_contaner"
            android:layout_width="100dp"
            android:layout_height="match_parent"
            android:background="#193646"
            android:orientation="vertical"
            android:paddingTop="30dp" >
        </LinearLayout>

        <com.kookong.tv.view.ZoomGridView
            android:id="@+id/tvwallv2_gridview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/channelactivity_bg"
            android:clipChildren="false"
            android:clipToPadding="false"
            android:horizontalSpacing="20dp"
            android:numColumns="3"
            android:paddingBottom="30dp"
            android:paddingTop="30dp"
            android:paddingLeft="20dp"
            android:paddingRight="20dp"
            android:scrollbars="none"
            android:verticalSpacing="20dp" />
    </LinearLayout>

    <com.kookong.tv.view.MetroCursorView //和gridview平级
        android:id="@+id/mcursorview"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" >
    </com.kookong.tv.view.MetroCursorView>

    <View
        android:id="@+id/tvwallv2_left_nav_cursor"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:background="#552DABFF" >
    </View>

</FrameLayout>




另外, 为Listview添加选中的另一种方式, 也可以在listview的平级放一个View, listview变化的时候, 不断的更改

和这个View的坐标位置



Rect rect = new Rect(0, 0, 0, 0);
                        containerView.getGlobalVisibleRect(rect);//获取containerView的位置
                        FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) mTvwallv2_left_nav_cursor.getLayoutParams();
                        layoutParams.leftMargin = rect.left;
                        if (mStatusBarHeight == -1) {
                            mStatusBarHeight = SystemUtil.getStatusBarHeight(TVWallActivityV2.this);
                        }
                        layoutParams.topMargin = rect.top - mStatusBarHeight; //位置需要去点StatusBar的高度
                        mTvwallv2_left_nav_cursor.setLayoutParams(layoutParams);






转载于:https://my.oschina.net/sfshine/blog/499581

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值