zoukankan      html  css  js  c++  java
  • drawChild中画阴影,裁剪出圆角

    我们在EasyConstraintLayout中初始化paint,并且关闭硬件加速,然后在drawChild中实现阴影逻辑,最终代码如下。

    public class EasyConstraintLayout extends ConstraintLayout {
    private Paint shadowPaint;
    private Paint clipPaint;

    public EasyConstraintLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    shadowPaint = new Paint();
    shadowPaint.setAntiAlias(true);
    shadowPaint.setDither(true);
    shadowPaint.setFilterBitmap(true);
    shadowPaint.setStyle(Paint.Style.FILL);

    clipPaint = new Paint();
    clipPaint.setAntiAlias(true);
    clipPaint.setDither(true);
    clipPaint.setFilterBitmap(true);
    clipPaint.setStyle(Paint.Style.FILL);
    setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }

    @Override
    public ConstraintLayout.LayoutParams generateLayoutParams(AttributeSet attrs) {
    return new LayoutParams(getContext(), attrs);
    }

    @Override
    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
    return p instanceof LayoutParams;
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);
    for (int i = 0, size = getChildCount(); i < size; i++) {
    View v = getChildAt(i);
    ViewGroup.LayoutParams lp = v.getLayoutParams();
    if (lp instanceof EasyLayoutParams) {
    EasyLayoutParams elp = (EasyLayoutParams) lp;
    elp.getData().initPaths(v);
    }
    }
    }

    @Override
    protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
    ViewGroup.LayoutParams lp = child.getLayoutParams();
    boolean ret = false;
    if (lp instanceof EasyLayoutParams) {
    EasyLayoutParams elp = (EasyLayoutParams) lp;
    LayoutParamsData data = elp.getData();
    if (isInEditMode()) {//预览模式采用裁剪
    canvas.save();
    canvas.clipPath(data.widgetPath);
    ret = super.drawChild(canvas, child, drawingTime);
    canvas.restore();
    return ret;
    }
    if (!data.hasShadow && !data.needClip)
    return super.drawChild(canvas, child, drawingTime);
    //为解决锯齿问题,正式环境采用xfermode
    if (data.hasShadow) {
    int count = canvas.saveLayer(null, null, Canvas.ALL_SAVE_FLAG);
    shadowPaint.setShadowLayer(data.shadowEvaluation, data.shadowDx, data.shadowDy, data.shadowColor);
    shadowPaint.setColor(data.shadowColor);
    canvas.drawPath(data.widgetPath, shadowPaint);
    shadowPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
    shadowPaint.setColor(Color.WHITE);
    canvas.drawPath(data.widgetPath, shadowPaint);
    shadowPaint.setXfermode(null);
    canvas.restoreToCount(count);

    }
    if (data.needClip) {
    int count = canvas.saveLayer(child.getLeft(), child.getTop(), child.getRight(), child.getBottom(), null, Canvas.ALL_SAVE_FLAG);
    ret = super.drawChild(canvas, child, drawingTime);
    clipPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    clipPaint.setColor(Color.WHITE);
    canvas.drawPath(data.clipPath, clipPaint);
    clipPaint.setXfermode(null);
    canvas.restoreToCount(count);
    }
    }
    return ret;
    }

    static class LayoutParams extends ConstraintLayout.LayoutParams implements EasyLayoutParams {

    private LayoutParamsData data;

    public LayoutParams(Context c, AttributeSet attrs) {
    super(c, attrs);
    data = new LayoutParamsData(c, attrs);
    }

    @Override
    public LayoutParamsData getData() {
    return data;
    }
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    使用方法
    <?xml version="1.0" encoding="utf-8"?>
    <io.github.iamyours.easylayout.EasyConstraintLayout 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">

    <View
    android:id="@+id/v_back"
    android:layout_width="match_parent"
    android:layout_height="150dp"
    android:layout_margin="10dp"
    android:background="#fff"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_radius="4dp"
    app:layout_shadowColor="#3ccc"
    app:layout_shadowEvaluation="15dp" />

    <ImageView
    android:id="@+id/iv_head"
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:layout_gravity="center_horizontal"
    android:layout_marginLeft="10dp"
    android:background="#eee"
    app:layout_constraintBottom_toBottomOf="@id/v_back"
    app:layout_constraintLeft_toLeftOf="@id/v_back"
    app:layout_constraintTop_toTopOf="@id/v_back"
    app:layout_radius="40dp"
    app:layout_shadowColor="#5f00"
    app:layout_shadowEvaluation="8dp" />

    <View
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_marginTop="30dp"
    android:background="#ccc"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@id/v_back"
    app:layout_radius="30dp"
    app:layout_shadowColor="#8f0f"
    app:layout_shadowDx="4dp"
    app:layout_shadowDy="4dp"
    app:layout_shadowEvaluation="10dp" />
    </io.github.iamyours.easylayout.EasyConstraintLayout>
    --------------------- 

  • 相关阅读:
    现在的代码,贴一下
    2014年七月写过的代码,现在看来,还有待改进呀
    第一次做技术论坛发博文,不知道说点啥
    04-树6. Huffman Codes--优先队列(堆)在哈夫曼树与哈夫曼编码上的应用
    04-树5. File Transfer--并查集
    04-树4. Root of AVL Tree-平衡查找树AVL树的实现
    03-树3. Tree Traversals Again (25)将先序遍历和中序遍历转为后序遍历
    03-树2. List Leaves (25) 二叉树的层序遍历
    二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历
    最大子序列和问题之算法优化
  • 原文地址:https://www.cnblogs.com/ly570/p/11284704.html
Copyright © 2011-2022 走看看