天天看點

安卓android webview圓角效果

一開始使用shape的方式實作,發現不行,網頁出來以後就會填充滿

後來使用搜尋引擎,看到其他人實作的webview圓角效果,連接配接  http://blog.csdn.net/zxwd2015/article/details/64554653

實測,性能太差,卡頓明顯

于是自己重寫

看了下他的代碼,搞了4個path,各種moveTo和lineTo,我就想能不能把4個path合成1個path

或者能不能找到一個函數可以搞定的,找到了addRoundRect函數

呃,這就很舒服

連結:

http://www.cnblogs.com/everhad/p/6161083.html

http://blog.csdn.net/qiushi_1990/article/details/53188554

是以,自己改了下他們的代碼

完整代碼如下:

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

/**
 * 圓角webview
 */
public class CornersWebView extends WebView {
    private float top_left = 0;
    private float top_right = 0;
    private float bottom_left = 0;
    private float bottom_right = 0;
    private int vWidth;
    private int vHeight;
    private int x;
    private int y;
    private Paint paint1;
    private Paint paint2;

    private float[] radiusArray = {0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f};


    public CornersWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    public CornersWebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {
        paint1 = new Paint();
        paint1.setColor(Color.WHITE);
        paint1.setAntiAlias(true);
        paint1.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));

        paint2 = new Paint();
        paint2.setXfermode(null);

        final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.cornersWebView); // 讀取xml styleable,attrs是xml屬性的集合

        top_left = a.getDimension(R.styleable.cornersWebView_top_left, 0);
        top_right = a.getDimension(R.styleable.cornersWebView_top_right, 0);
        bottom_left = a.getDimension(R.styleable.cornersWebView_bottom_left, 0);
        bottom_right = a.getDimension(R.styleable.cornersWebView_bottom_right, 0);

        setRadius(top_left, top_right, bottom_right, bottom_left);
    }

    /**
     * 設定四個角的圓角半徑
     */
    public void setRadius(float leftTop, float rightTop, float rightBottom, float leftBottom) {
        radiusArray[0] = leftTop;
        radiusArray[1] = leftTop;
        radiusArray[2] = rightTop;
        radiusArray[3] = rightTop;
        radiusArray[4] = rightBottom;
        radiusArray[5] = rightBottom;
        radiusArray[6] = leftBottom;
        radiusArray[7] = leftBottom;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        vWidth = getMeasuredWidth();
        vHeight = getMeasuredHeight();
    }


    @Override
    public void onDraw(Canvas canvas) {
        Log.e("jiejing", "onDraw");
        x = this.getScrollX();
        y = this.getScrollY();
        Path path = new Path();
        path.addRoundRect(new RectF(0, y, x + vWidth, y + vHeight), radiusArray, Path.Direction.CW);        // 使用半角的方式,性能比較好
        canvas.clipPath(path);
        super.onDraw(canvas);
    }
}      

注意:

cavas.clipPath不支援硬體加速,記得在AndroidManifest.xml中設定不使用硬體加速。不然效果出不來

或者myView.setLayerType(View.

LAYER_TYPE_SOFTWARE      

, null); //關閉硬體加速