zoukankan      html  css  js  c++  java
  • 安卓圆角、背景遮罩。覆盖实现方式(适用于所有控件)

    1.工具类直接用(已经改好)

    package com.etwod.yulin.t4.unit;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.PorterDuff;
    import android.graphics.PorterDuffXfermode;
    import android.graphics.RectF;
    import android.support.annotation.ColorInt;
    import android.util.AttributeSet;
    import android.view.View;
    
    import com.etwod.yulin.android.R;
    
    /**
     * A circular cover view.Above other views to hide the conner.You can set radians by self.
     * Created by
     * 磊磊tua
     * 覆盖形成圆角
     */
    public class CircularCoverView extends View {
    
        private int leftTopRadians = 30;        //leftTopRadians
        private int leftBottomRadians = 30;     //leftBottomRadians
        private int rightTopRadians = 30;       //rightTopRadians
        private int rightBottomRadians = 30;    //rightBottomRadians
    
        private int coverColor = 0xffeaeaea;    //color of cover.
    
        public CircularCoverView(Context context) {
            this(context, null, 0);
        }
    
        public CircularCoverView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public CircularCoverView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
    
            TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircularCoverView);
            leftTopRadians = typedArray.getDimensionPixelSize(R.styleable.CircularCoverView_left_top_radius, leftTopRadians);
            leftBottomRadians = typedArray.getDimensionPixelSize(R.styleable.CircularCoverView_left_bottom_radius, leftBottomRadians);
            rightTopRadians = typedArray.getDimensionPixelSize(R.styleable.CircularCoverView_right_top_radius, rightTopRadians);
            rightBottomRadians = typedArray.getDimensionPixelSize(R.styleable.CircularCoverView_right_bottom_radius, rightBottomRadians);
            coverColor = typedArray.getColor(R.styleable.CircularCoverView_cover_color, coverColor);
        }
    
        /**
         * set radians of cover.
         */
        public void setRadians(int leftTopRadians, int rightTopRadians, int leftBottomRadians, int rightBottomRadians) {
            this.leftTopRadians = leftTopRadians;
            this.rightTopRadians = rightTopRadians;
            this.leftBottomRadians = leftBottomRadians;
            this.rightBottomRadians = rightBottomRadians;
        }
    
        /**
         * set color of cover.
         *
         * @param coverColor cover's color
         */
        public void setCoverColor(@ColorInt int coverColor) {
            this.coverColor = coverColor;
        }
    
        /**
         * create a sector-bitmap as the dst.
         *
         * @param w width of bitmap
         * @param h height of bitmap
         * @return bitmap
         */
        private Bitmap drawSector(int w, int h) {
            Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            Canvas c = new Canvas(bm);
            Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
            p.setColor(0xFFFFCC44);//notice:cannot set transparent color here.otherwise cannot clip at final.
    
            c.drawArc(new RectF(0, 0, leftTopRadians * 2, leftTopRadians * 2), 180, 90, true, p);
            c.drawArc(new RectF(0, getHeight() - leftBottomRadians * 2, leftBottomRadians * 2, getHeight()), 90, 90, true, p);
            c.drawArc(new RectF(getWidth() - rightTopRadians * 2, 0, getWidth(), rightTopRadians * 2), 270, 90, true, p);
            c.drawArc(new RectF(getWidth() - rightBottomRadians * 2, getHeight() - rightBottomRadians * 2, getWidth(), getHeight()), 0, 90, true, p);
            return bm;
        }
    
        /**
         * create a rect-bitmap as the src.
         *
         * @param w width of bitmap
         * @param h height of bitmap
         * @return bitmap
         */
        private Bitmap drawRect(int w, int h) {
            Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            Canvas c = new Canvas(bm);
            Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
            p.setColor(coverColor);
    
            c.drawRect(new RectF(0, 0, leftTopRadians, leftTopRadians), p);
            c.drawRect(new RectF(0, getHeight() - leftBottomRadians, leftBottomRadians, getHeight()), p);
            c.drawRect(new RectF(getWidth() - rightTopRadians, 0, getWidth(), rightTopRadians), p);
            c.drawRect(new RectF(getWidth() - rightBottomRadians, getHeight() - rightBottomRadians, getWidth(), getHeight()), p);
            return bm;
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            Paint paint = new Paint();
            paint.setFilterBitmap(false);
            paint.setStyle(Paint.Style.FILL);
    
            //create a canvas layer to show the mix-result
            int sc = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, Canvas.MATRIX_SAVE_FLAG |
                    Canvas.CLIP_SAVE_FLAG |
                    Canvas.HAS_ALPHA_LAYER_SAVE_FLAG |
                    Canvas.FULL_COLOR_LAYER_SAVE_FLAG |
                    Canvas.CLIP_TO_LAYER_SAVE_FLAG);
    
            //draw sector-dst-bitmap at first.
            canvas.drawBitmap(drawSector(getWidth(), getHeight()), 0, 0, paint);
            //set Xfermode of paint.
            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
            //then draw rect-src-bitmap
            canvas.drawBitmap(drawRect(getWidth(), getHeight()), 0, 0, paint);
            paint.setXfermode(null);
            //restore the canvas
            canvas.restoreToCount(sc);
        }
    }

    2.在attrs 进行配置

      <!-- 圆角遮罩-->
        <declare-styleable name="CircularCoverView">
    
        <attr name="left_top_radius" format="dimension"/>
    
        <attr name="left_bottom_radius" format="dimension"/>
    
        <attr name="right_top_radius" format="dimension"/>
    
        <attr name="right_bottom_radius" format="dimension"/>
    
        <attr name="cover_color" format="color"/>
    
    </declare-styleable>

    3.控件的两种用法

    <1>在布局文件的用法 只需在布局设置就好了(注意:必须用相对布局实现)

    相对布局
     <com.etwod.yulin.t4.unit.CircularCoverView
                android:id="@+id/ccv_ads"
                android:layout_width="match_parent"
                android:layout_height="180dp"
                app:cover_color="@color/red"
                app:left_bottom_radius="9dp"
                app:left_top_radius="9dp"
                app:right_bottom_radius="9dp"
                app:right_top_radius="9dp" />
    left_bottom_radius
    left_top_radius
    right_bottom_radius
    right_top_radius
    分别代表左下 左上 右下 右上
    <2>在布局文件的用法 只需在布局设置
    RelativeLayout container = new RelativeLayout(this);
    //create other child views...
    CircularCoverView coverView = new CircularCoverView(this);
    coverView.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    coverView.setCoverColor(Color.WHITE);
    coverView.setRadians(35, 35, 35, 35);
    container.addView(coverView);

    非常好用 不受任何限制,其他不能实现首选推荐!!!

    by:磊磊tua

     
  • 相关阅读:
    Android AndroidManifest 清单文件以及权限详解!【转】
    java的几个版本以及jre,jdk等概念——【转载】JDK、Java SE、Java EE、Java ME我该选
    eclipse中的两种Jre 及 Jre与Jdk的区别
    LAMP_yum安装
    CentOS7修改主机名(hostname)
    Linux下U盘挂载
    mount命令
    vmware虚拟机无法连接网络
    shell中awk printf的用法
    scp命令
  • 原文地址:https://www.cnblogs.com/widgetbox/p/10042369.html
Copyright © 2011-2022 走看看