圆形imageview以及Blur实现

###圆形Imageview以及Blur
首先效果图



  • 圆形图片代码部分:
/**
 * 描述:圆形头像
 * 作者:Marc on 2016/8/4 13:20
 * 邮箱:aliali_ha@yeah.net
 */
public class RoundImageView extends ImageView {

    private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;

    private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
    private static final int COLORDRAWABLE_DIMENSION = 2;

    private static final int DEFAULT_BORDER_WIDTH = 0;
    private static final int DEFAULT_BORDER_COLOR = Color.BLACK;
    private static final boolean DEFAULT_BORDER_OVERLAY = false;

    private final RectF mDrawableRect = new RectF();
    private final RectF mBorderRect = new RectF();

    private final Matrix mShaderMatrix = new Matrix();
    private final Paint mBitmapPaint = new Paint();
    private final Paint mBorderPaint = new Paint();

    private int mBorderColor = DEFAULT_BORDER_COLOR;
    private int mBorderWidth = DEFAULT_BORDER_WIDTH;

    private Bitmap mBitmap;
    private BitmapShader mBitmapShader;
    private int mBitmapWidth;
    private int mBitmapHeight;

    private float mDrawableRadius;
    private float mBorderRadius;

    private ColorFilter mColorFilter;

    private boolean mReady;
    private boolean mSetupPending;
    private boolean mBorderOverlay;

    public RoundImageView(Context context) {
        super(context);

        init();
    }

    public RoundImageView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public RoundImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.roundedimageview, defStyle, 0);

        mBorderWidth = a.getDimensionPixelSize(R.styleable.roundedimageview_border_width, DEFAULT_BORDER_WIDTH);
        mBorderColor = a.getColor(R.styleable.roundedimageview_border_color, DEFAULT_BORDER_COLOR);
        mBorderOverlay = a.getBoolean(R.styleable.roundedimageview_border_overlay, DEFAULT_BORDER_OVERLAY);

        a.recycle();

        init();
    }

    private void init() {
        super.setScaleType(SCALE_TYPE);
        mReady = true;

        if (mSetupPending) {
            setup();
            mSetupPending = false;
        }
    }

    @Override
    public ScaleType getScaleType() {
        return SCALE_TYPE;
    }

    @Override
    public void setScaleType(ScaleType scaleType) {
        if (scaleType != SCALE_TYPE) {
            throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));
        }
    }

    @Override
    public void setAdjustViewBounds(boolean adjustViewBounds) {
        if (adjustViewBounds) {
            throw new IllegalArgumentException("adjustViewBounds not supported.");
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (getDrawable() == null) {
            return;
        }

        canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint);
        if (mBorderWidth != 0) {
            canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint);
        }
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        setup();
    }

    public int getBorderColor() {
        return mBorderColor;
    }

    public void setBorderColor(int borderColor) {
        if (borderColor == mBorderColor) {
            return;
        }

        mBorderColor = borderColor;
        mBorderPaint.setColor(mBorderColor);
        invalidate();
    }

    public void setBorderColorResource(@ColorRes int borderColorRes) {
        setBorderColor(getContext().getResources().getColor(borderColorRes));
    }

    public int getBorderWidth() {
        return mBorderWidth;
    }

    public void setBorderWidth(int borderWidth) {
        if (borderWidth == mBorderWidth) {
            return;
        }

        mBorderWidth = borderWidth;
        setup();
    }

    public boolean isBorderOverlay() {
        return mBorderOverlay;
    }

    public void setBorderOverlay(boolean borderOverlay) {
        if (borderOverlay == mBorderOverlay) {
            return;
        }

        mBorderOverlay = borderOverlay;
        setup();
    }

    @Override
    public void setImageBitmap(Bitmap bm) {
        super.setImageBitmap(bm);
        mBitmap = bm;
        setup();
    }

    @Override
    public void setImageDrawable(Drawable drawable) {
        super.setImageDrawable(drawable);
        mBitmap = getBitmapFromDrawable(drawable);
        setup();
    }

    @Override
    public void setImageResource(@DrawableRes int resId) {
        super.setImageResource(resId);
        mBitmap = getBitmapFromDrawable(getDrawable());
        setup();
    }

    @Override
    public void setImageURI(Uri uri) {
        super.setImageURI(uri);
        mBitmap = getBitmapFromDrawable(getDrawable());
        setup();
    }

    @Override
    public void setColorFilter(ColorFilter cf) {
        if (cf == mColorFilter) {
            return;
        }

        mColorFilter = cf;
        mBitmapPaint.setColorFilter(mColorFilter);
        invalidate();
    }

    private Bitmap getBitmapFromDrawable(Drawable drawable) {
        if (drawable == null) {
            return null;
        }

        if (drawable instanceof BitmapDrawable) {
            return ((BitmapDrawable) drawable).getBitmap();
        }

        try {
            Bitmap bitmap;

            if (drawable instanceof ColorDrawable) {
                bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
            } else {
                bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
            }

            Canvas canvas = new Canvas(bitmap);
            drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
            drawable.draw(canvas);
            return bitmap;
        } catch (OutOfMemoryError e) {
            return null;
        }
    }

    private void setup() {
        if (!mReady) {
            mSetupPending = true;
            return;
        }

        if (mBitmap == null) {
            return;
        }

        mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

        mBitmapPaint.setAntiAlias(true);
        mBitmapPaint.setShader(mBitmapShader);

        mBorderPaint.setStyle(Paint.Style.STROKE);
        mBorderPaint.setAntiAlias(true);
        mBorderPaint.setColor(mBorderColor);
        mBorderPaint.setStrokeWidth(mBorderWidth);

        mBitmapHeight = mBitmap.getHeight();
        mBitmapWidth = mBitmap.getWidth();

        mBorderRect.set(0, 0, getWidth(), getHeight());
        mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2);

        mDrawableRect.set(mBorderRect);
        if (!mBorderOverlay) {
            mDrawableRect.inset(mBorderWidth, mBorderWidth);
        }
        mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2);

        updateShaderMatrix();
        invalidate();
    }

    private void updateShaderMatrix() {
        float scale;
        float dx = 0;
        float dy = 0;

        mShaderMatrix.set(null);

        if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) {
            scale = mDrawableRect.height() / (float) mBitmapHeight;
            dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
        } else {
            scale = mDrawableRect.width() / (float) mBitmapWidth;
            dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
        }

        mShaderMatrix.setScale(scale, scale);
        mShaderMatrix.postTranslate((int) (dx + 0.5f) + mDrawableRect.left, (int) (dy + 0.5f) + mDrawableRect.top);

        mBitmapShader.setLocalMatrix(mShaderMatrix);
    }
}
  • attrs 部分
      <!--圆形头像-->
<declare-styleable name="roundedimageview">
    <!-- 圆形图片 -->
        <attr name="border_width" format="dimension" />
        <attr name="border_color" format="color" />
        <attr name="border_overlay" format="boolean" />
</declare-styleable>

     <!--虚化背景-->
<declare-styleable name="BlurredView">
    <attr name="src" format="reference" />
    <attr name="move" format="boolean" />
    <attr name="disableBlurred" format="boolean" />
</declare-styleable>
  • Blur毛玻璃效果

这个从网上看到的,摘过来

  • BlurBitmap

                        /**
     * 描述:
     * 作者:Marc on 2016/8/4 09:14
     * 邮箱:aliali_ha@yeah.net
     */
    public class BlurBitmap {
        /**
         * 图片缩放比例
         */
        private static final float BITMAP_SCALE = 0.4f;
    
        /**
         * 最大模糊度(在0.0到25.0之间)
         */
        private static final float BLUR_RADIUS = 25f;
    
        @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
        public static Bitmap blur(Context context, Bitmap image) {
            // 计算图片缩小后的长宽
            int width = Math.round(image.getWidth() * BITMAP_SCALE);
            int height = Math.round(image.getHeight() * BITMAP_SCALE);
    
            // 将缩小后的图片做为预渲染的图片。
            Bitmap inputBitmap = Bitmap.createScaledBitmap(image, width, height, false);
            // 创建一张渲染后的输出图片。
            Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap);
    
            // 创建RenderScript内核对象
            RenderScript rs = RenderScript.create(context);
            // 创建一个模糊效果的RenderScript的工具对象
            ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
            // 由于RenderScript并没有使用VM来分配内存,所以需要使用Allocation类来创建和分配内存空间。
            // 创建Allocation对象的时候其实内存是空的,需要使用copyTo()将数据填充进去。
            Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap);
            Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap);
    
            // 设置渲染的模糊程度, 25f是最大模糊度
            blurScript.setRadius(BLUR_RADIUS);
            // 设置blurScript对象的输入内存
            blurScript.setInput(tmpIn);
            // 将输出数据保存到输出内存中
            blurScript.forEach(tmpOut);
    
            // 将数据填充到Allocation中
            tmpOut.copyTo(outputBitmap);
    
            return outputBitmap;
        }
    }
    
  • BlurredUtil

            /**
     * 描述:
     * 作者:Marc on 2016/8/4 10:16
     * 邮箱:aliali_ha@yeah.net
     */
    public class BlurredUtil {
    
    /**
     * 将Drawable对象转化为Bitmap对象
     *
     * @param drawable Drawable对象
     * @return 对应的Bitmap对象
     */
    static Bitmap drawableToBitmap(Drawable drawable) {
        Bitmap bitmap;

        if (drawable instanceof BitmapDrawable) {
            BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
            if (bitmapDrawable.getBitmap() != null) {
                return bitmapDrawable.getBitmap();
            }
        }

        if (drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
            bitmap = Bitmap.createBitmap(1, 1,
                    Bitmap.Config.ARGB_8888); // Single color bitmap will be created of 1x1 pixel
        } else {
            bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),
                    Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
        drawable.draw(canvas);
        return bitmap;
    }

}
  • BlurredView

            /**
     * 描述:
     * 作者:Marc on 2016/8/4 10:16
     * 邮箱:aliali_ha@yeah.net
     */
    public class BlurredView extends RelativeLayout{
        /**
         * 模糊最大化值
         */
        private static final int ALPHA_MAX_VALUE = 255;
    
        /**
         * Context
         */
        private Context mContext;
    
        /**
         * 模糊后的ImageView
         */
        private ImageView mBlurredImg;
    
        /**
         * 原图ImageView
         */
        private ImageView mOriginImg;
        /**
         * 原图Bitmap
         */
        private Bitmap mOriginBitmap;
    
        /**
         * 模糊后的Bitmap
         */
        private Bitmap mBlurredBitmap;
    
        /**
         * 是否禁用模糊效果
         */
        private boolean isDisableBlurred;
    
        /**
         * 是否移动背景图片
         */
        private boolean isMove;
        public BlurredView(Context context) {
            super(context);
            init(context);
        }
    
        public BlurredView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context);
            initAttr(context, attrs);
        }
    
        public BlurredView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init(context);
            initAttr(context, attrs);
        }
    
        private void init(Context context) {
            mContext = context;
            LayoutInflater.from(context).inflate(R.layout.blurredview, this);
            mOriginImg = (ImageView) findViewById(R.id.blurredview_origin_img);
            mBlurredImg = (ImageView) findViewById(R.id.blurredview_blurred_img);
        }
    
        private void initAttr(Context context, AttributeSet attrs) {
    
            TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.BlurredView);
            Drawable drawable = typedArray.getDrawable(R.styleable.BlurredView_src);
            isMove = typedArray.getBoolean(R.styleable.BlurredView_move, false);
            isDisableBlurred = typedArray.getBoolean(R.styleable.BlurredView_disableBlurred, false);
    
            typedArray.recycle();
    
            // blur image
            if (null != drawable) {
                mOriginBitmap = BlurredUtil.drawableToBitmap(drawable);
                mBlurredBitmap = BlurBitmap.blur(context, mOriginBitmap);
            }
    
            // setVisibility
            if (!isDisableBlurred) {
                mBlurredImg.setVisibility(VISIBLE);
            }
    
            // setMove
            if (null != drawable) {
                setMove(context, isMove);
            }
        }
    
        /**
         * 设置背景图片移动效果
         * @param context   上下文对象
         * @param isMove    是否移动
         */
        private void setMove(Context context, boolean isMove) {
            if (isMove) {
                WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
                Display display = wm.getDefaultDisplay();
                Point point = new Point();
                display.getSize(point);
                int height = point.y;
                setBlurredHeight(height, mOriginImg);
                setBlurredHeight(height, mBlurredImg);
            }
        }
    
        /**
         * 改变图片的高度
         *
         * @param height        图片的高度
         * @param imageView     imageview对象
         */
        private void setBlurredHeight(int height, ImageView imageView) {
            ViewGroup.LayoutParams params = imageView.getLayoutParams();
            params.width = ViewGroup.LayoutParams.MATCH_PARENT;
            params.height = height + 100;
            imageView.requestLayout();
        }
    
        @Override
        protected void onFinishInflate() {
            super.onFinishInflate();
            setImageView();
        }
    
        /**
         * 填充ImageView.
         */
        private void setImageView() {
            mBlurredImg.setImageBitmap(mBlurredBitmap);
            mOriginImg.setImageBitmap(mOriginBitmap);
        }
    
        /**
         * 以代码的方式添加待模糊的图片
         *
         * @param blurredBitmap 待模糊的图片
         */
        public void setBlurredImg(Bitmap blurredBitmap) {
            if (null != blurredBitmap) {
                mOriginBitmap = blurredBitmap;
                mBlurredBitmap = BlurBitmap.blur(mContext, blurredBitmap);
                setImageView();
                setMove(mContext, isMove);
            }
        }
    
        /**
         * 以代码的方式添加待模糊的图片
         *
         * @param blurDrawable 待模糊的图片
         */
        public void setBlurredImg(Drawable blurDrawable) {
            if (null != blurDrawable) {
                mOriginBitmap = BlurredUtil.drawableToBitmap(blurDrawable);
                mBlurredBitmap = BlurBitmap.blur(mContext, mOriginBitmap);
                setImageView();
                setMove(mContext, isMove);
            }
        }
    
        /**
         * 设置模糊程度
         *
         * @param level 模糊程度, 数值在 0~100 之间.
         */
        public void setBlurredLevel(int level) {
            if (level < 0 || level > 100) {
                throw new IllegalStateException("No validate level, the value must be 0~100");
            }
            if (isDisableBlurred) {
                return;
            }
            mOriginImg.setAlpha((int) (ALPHA_MAX_VALUE - level * 2.55));
        }
    
        /**
         * 设置图片上移的距离
         *
         * @param hight 向上移动的距离
         */
        public void setBlurredTop(int hight) {
            mOriginImg.setTop(-hight);
            mBlurredImg.setTop(-hight);
        }
    
        /**
         * 显示模糊图片
         */
        public void showBlurredView() {
            mBlurredImg.setVisibility(VISIBLE);
        }
    
        /**
         * 禁用模糊效果
         */
        public void disableBlurredView() {
            isDisableBlurred = true;
            mOriginImg.setAlpha(ALPHA_MAX_VALUE);
            mBlurredImg.setVisibility(INVISIBLE);
        }
    
        /**
         * 启用模糊效果
         */
        public void enableBlurredView() {
            isDisableBlurred = false;
            mBlurredImg.setVisibility(VISIBLE);
        }
    }
    

###使用

  • BlueActivity

            /**
     * 描述:
     * 作者:Marc on 2016/8/4 10:29
     * 邮箱:aliali_ha@yeah.net
     */
    public class BlueActivity extends AppCompatActivity {
        Toolbar toolbar;
        TextView toobarTv;
        BlurWeatherFragment fragment1;
        BlurredViewBasicFragment fragment2;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_blue_main);
            ButterKnife.bind(this);
            toolbar = (Toolbar) findViewById(R.id.toolbar);
            toobarTv = (TextView) findViewById(R.id.toolbar_tv);
            toobarTv.setText("Blur");
            fragment1 = new BlurWeatherFragment();
            fragment2 = new BlurredViewBasicFragment();
            setDefaultFragment();
        }
    
        private void setDefaultFragment() {
            FragmentManager manager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = manager.beginTransaction();
            fragmentTransaction.replace(R.id.container, fragment1);
            fragmentTransaction.commit();
        }
    
        @OnClick({R.id.blue_btn1, R.id.blue_btn2})
        public void onClick(View view) {
            FragmentManager manager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = manager.beginTransaction();
            switch (view.getId()) {
                case R.id.blue_btn1:
                    if (fragment1 == null) {
                        fragment1 = new BlurWeatherFragment();
                    }
                    fragmentTransaction.replace(R.id.container, fragment1);
                    break;
                case R.id.blue_btn2:
                    if (fragment2 == null) {
                        fragment2 = new BlurredViewBasicFragment();
                    }
                    fragmentTransaction.replace(R.id.container, fragment2);
                    break;
            }
            fragmentTransaction.commit();
        }
    }
    

xml 布局

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

    <include layout="@layout/toolbar" />

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

        <Button
            android:id="@+id/blue_btn1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="RecycleView样式" />

        <Button
            android:id="@+id/blue_btn2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="调节虚化" />

    </LinearLayout>

    <RelativeLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></RelativeLayout>
</LinearLayout>
  • BlurredViewBasicFragment
        /**
 * 描述:
 * 作者:Marc on 2016/8/4 10:54
 * 邮箱:aliali_ha@yeah.net
 */
public class BlurredViewBasicFragment extends Fragment {
    Activity activity;
    /**
     * 进度条SeekBar
     */
    private SeekBar mSeekBar;

    /**
     * 显示进度的文字
     */
    private TextView mProgressTv;

    /**
     * Blurredview
     */
    private BlurredView mBlurredView;
    private View view;


    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        activity = getActivity();
    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = View.inflate(activity, R.layout.blurrediview_basic, null);
        // 初始化视图
        initViews();

        // 处理seekbar滑动事件
        setSeekBar();
        return view;
    }


    private void initViews() {
        mSeekBar = (SeekBar) view.findViewById(R.id.activity_main_seekbar);
        mProgressTv = (TextView) view.findViewById(R.id.activity_main_progress_tv);
        mBlurredView = (BlurredView) view.findViewById(R.id.activity_main_blurredview);

        // 可以在代码中使用setBlurredImg()方法指定需要模糊的图片
        mBlurredView.setBlurredImg(getResources().getDrawable(R.drawable.gou));

        // 设置完成后需要调用showBlurredView方法显示要模糊的图片
        mBlurredView.showBlurredView();
    }

    private void setSeekBar() {
        mSeekBar.setMax(100);
        mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                mBlurredView.setBlurredLevel(progress);
                mProgressTv.setText(String.valueOf(progress));
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
    }
}

xml布局

        <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <com.tescoo.aat.aat.blur.BlurredView
            android:id="@+id/activity_main_blurredview"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
        <!-- 没有指定圆形ImageView属性时,默认没有外边圆颜色 -->
        <!-- 需要将图片资源自定为src ,或在程序中setImageResource(res)
        不能设置background为图片,这样不能达到圆形效果-->
        <com.tescoo.aat.widget.RoundImageView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_centerInParent="true"
            android:src="@drawable/gou"
            app:border_color="#10FFFFFF"
            app:border_width="5dp" />
    </RelativeLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:orientation="vertical">

        <SeekBar
            android:id="@+id/activity_main_seekbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            android:layout_marginTop="@dimen/activity_vertical_margin" />

        <TextView
            android:id="@+id/activity_main_progress_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="0"
            android:textSize="24sp" />
    </LinearLayout>

</LinearLayout>
  • BlurRecycleFragment

    /**
     * 描述:
     * 作者:Marc on 2016/8/4 10:44
     * 邮箱:aliali_ha@yeah.net
     */
    public class BlurRecycleFragment extends Fragment {
        /**
         * blurredview
         */
        private BlurredView mBlurredView;
    
        /**
         * RecyclerView
         */
        private RecyclerView mRecyclerView;
    
        private int mScrollerY;
    
        private int mAlpha;
    
    Activity activity;

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        activity = getActivity();
    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = View.inflate(activity, R.layout.blurrediview_weather, null);
        mBlurredView = (BlurredView) view.findViewById(R.id.yahooweather_blurredview);
        mRecyclerView = (RecyclerView) view.findViewById(R.id.yahooweather_recyclerview);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(activity));
        mRecyclerView.setAdapter(new RecyclerViewAdapter(activity));
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                mScrollerY += dy;
                if (Math.abs(mScrollerY) > 1000) {
                    mBlurredView.setBlurredTop(100);
                    mAlpha = 100;
                } else {
                    mBlurredView.setBlurredTop(mScrollerY / 10);
                    mAlpha = Math.abs(mScrollerY) / 10;
                }
                mBlurredView.setBlurredLevel(mAlpha);
            }
        });
        return view;
    }
}

xml布局

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

    <com.tescoo.aat.aat.blur.BlurredView
        android:id="@+id/recycleblur_blurredview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:disableBlurred="false"
        app:move="true"
        app:src="@drawable/gou" />

    <LinearLayout
        android:id="@+id/top"
        android:background="@drawable/title_shape"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:paddingBottom="8dp"
        android:paddingTop="8dp">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="Marc"
            android:textColor="@android:color/white"
            android:textSize="18sp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="aliali_ha"
            android:textColor="@android:color/white"
            android:textSize="10sp" />
    </LinearLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/blur_recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/top" />
</RelativeLayout>
  • RecyclerViewAdapter
    /**
 * 描述:这里注意。使用了2个ViewHolder,类型使用RecyclerView.ViewHolder
 * 作者:Marc on 2016/8/4 14:27
 * 邮箱:aliali_ha@yeah.net
 */
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private final Context context;
    private static final int ITEM_COUNT = 10;

    private static final int TYPE_HEADER = 0;
    private static final int TYPE_ITEM = 1;

    public RecyclerViewAdapter(Context context) {
        this.context = context;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_HEADER) {
            return new HeaderHolder(LayoutInflater.from(context).inflate(R.layout.recyclerview_header, parent, false));
        }
        return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.recyclerview_item, parent, false));
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        //这里没使用数据
    }

    @Override
    public int getItemCount() {
        return ITEM_COUNT;
    }

    /**
     * recycleview增加header什么的感觉确实比listview方便了好多
     *
     * @param position
     * @return
     */
    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return TYPE_HEADER;
        } else {
            return TYPE_ITEM;
        }

    }

    /**
     * item的viewholder
     */
    public class ViewHolder extends RecyclerView.ViewHolder {
        public ViewHolder(View itemView) {
            super(itemView);
        }
    }

    /**
     * 头部viewholder
     */
    private class HeaderHolder extends RecyclerView.ViewHolder {
        public HeaderHolder(View itemView) {
            super(itemView);
        }
    }
}