Android自定义文章段落按钮

2019-01-29  本文已影响0人  沉默的菋道

效果如图:

效果图
<declare-styleable name="ParaView">
        <attr name="horizontalGravity">
            <flag name="left" value="1" />
            <flag name="center" value="2" />
            <flag name="right" value="3" />
        </attr>
        <attr name="verticalGravity">
            <flag name="top" value="1" />
            <flag name="center" value="2" />
            <flag name="bottom" value="3" />
        </attr>
        <attr name="gravityType">
            <flag name="horizontal" value="1" />
            <flag name="vertical"   value="2" />
        </attr>

        <attr name="checked" format="boolean"/>
    </declare-styleable>
<RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true">

        <com.mutantbox.onlymemo.widget.ParaView
            android:id="@+id/para_hor_left"
            android:layout_width="35dp"
            android:layout_height="35dp"
            ts:gravityType="horizontal"
            ts:horizontalGravity="left"/>

        <com.mutantbox.onlymemo.widget.ParaView
            android:id="@+id/para_hor_center"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:layout_toRightOf="@+id/para_hor_left"
            android:layout_marginLeft="15dp"
            ts:checked="true"
            ts:gravityType="horizontal"
            ts:horizontalGravity="center"/>

        <com.mutantbox.onlymemo.widget.ParaView
            android:id="@+id/para_hor_right"
            android:layout_width="35dp"
            android:layout_height="35dp"
            ts:gravityType="horizontal"
            android:layout_toRightOf="@+id/para_hor_center"
            android:layout_marginLeft="15dp"
            ts:horizontalGravity="right"/>

        <com.mutantbox.onlymemo.widget.ParaView
            android:id="@+id/para_ver_top"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:layout_below="@+id/para_hor_left"
            android:layout_marginTop="10dp"
            ts:gravityType="vertical"
            ts:verticalGravity="top"/>

        <com.mutantbox.onlymemo.widget.ParaView
            android:id="@+id/para_ver_center"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:layout_toRightOf="@+id/para_hor_left"
            android:layout_below="@+id/para_hor_left"
            android:layout_marginTop="10dp"
            android:layout_marginLeft="15sp"
            ts:checked="true"
            ts:gravityType="vertical"
            ts:verticalGravity="center"/>

        <com.mutantbox.onlymemo.widget.ParaView
            android:id="@+id/para_ver_bottom"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:layout_toRightOf="@+id/para_ver_center"
            android:layout_below="@+id/para_hor_left"
            android:layout_marginTop="10dp"
            android:layout_marginLeft="15dp"
            ts:gravityType="vertical"
            ts:verticalGravity="bottom"/>
    </RelativeLayout>
public class ParaView extends View {
    public static final int HORIZONTAL = 1;
    public static final int VERTICAL = 2;

    public static final int LEFT = 1;
    public static final int CENTER = 2;
    public static final int RIGHT = 3;
    public static final int TOP = 1;
    public static final int BOTTOM = 3;

    private int horizontalGravity = CENTER;
    private int verticalGravity = CENTER;
    private int gravityType = HORIZONTAL;

    private Context context;
    private Paint paint;

    private int width;
    private int height;
    private int topMargen;
    private int leftMargen;
    private int lineHeight;
    private int lineCount = 5;
    private int diverHeight;
    private boolean mChecked;

    private int bgColor = Color.WHITE;
    private int lineColor = Color.BLACK;
    private int lineNormalColor = Color.BLACK;
    private int lineCheckedColor = Color.WHITE;

    private int frameBgColor = Color.parseColor("#bfc0c2");

    private int bgCheckedColor = Color.parseColor("#EE4A21");
    private int bgTouchColor = Color.parseColor("#50000000");
    private int bgNormalColor = Color.WHITE;

    public ParaView(Context context) {
        super(context);
        this.context = context;
        paint = new Paint();
        init();
    }

    public ParaView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        obtainAttributes(context, attrs);
        paint = new Paint();
        init();
    }

    private void obtainAttributes(Context context, AttributeSet attrs) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ParaView);
        gravityType = typedArray.getInteger(R.styleable.ParaView_gravityType, 1);
        horizontalGravity = typedArray.getInteger(R.styleable.ParaView_horizontalGravity, 1);
        verticalGravity = typedArray.getInteger(R.styleable.ParaView_verticalGravity, 1);
        mChecked = typedArray.getBoolean(R.styleable.ParaView_checked, false);
        typedArray.recycle();

        bgColor = mChecked ? bgCheckedColor : bgNormalColor;
        lineColor = mChecked ? lineCheckedColor : lineNormalColor;
    }

    public void setGravity(int gravityType, int gravity) {
        this.gravityType = gravityType;
        if (gravityType == HORIZONTAL) {
            horizontalGravity = gravity;
        } else {
            verticalGravity = gravity;
        }
        invalidate();
    }

    public int getGravity(){
        if (gravityType == HORIZONTAL){
            return horizontalGravity;
        }
        return verticalGravity;
    }

    public boolean isChecked() {
        return mChecked;
    }

    public void setChecked(boolean checked) {
        this.mChecked = checked;
        bgColor = mChecked ? bgCheckedColor : bgNormalColor;
        lineColor = mChecked ? lineCheckedColor : lineNormalColor;
        invalidate();
    }

    private void init() {
        setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        if (!mChecked){
                            bgColor = bgTouchColor;
                            lineColor = lineNormalColor;
                            invalidate();
                        }
                        break;

                    case MotionEvent.ACTION_UP:
//                        mChecked = !mChecked;
                        setChecked(true);
                        if (l != null) {
                            l.onClick(v);
                        }
                        break;
                }
                return true;
            }
        });
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        setBackgroundColor(bgColor);
        paint.setColor(lineColor);
        paint.setAntiAlias(false);
        paint.setStyle(Paint.Style.FILL);

        width = getWidth();
        height = getHeight();
        topMargen = dp2px(context, 3);
        leftMargen = dp2px(context, 4);
        lineHeight = dp2px(context, 1.8f);
        paint.setStrokeWidth(lineHeight);
        diverHeight = (height - (topMargen * 2) - (lineCount * lineHeight)) / (lineCount + 1);
        //画边框
        if (!mChecked && bgColor != bgTouchColor) {
            int strokeWidth = dp2px(context, 2f);
            Paint paint = new Paint();
            paint.setColor(frameBgColor);
            paint.setStrokeWidth(strokeWidth);
            canvas.drawLine(0, 0, 0, height, paint);
            canvas.drawLine(0, 0, width, 0, paint);
            canvas.drawLine(width, 0, width, height, paint);
            canvas.drawLine(0, height, width, height, paint);
        }
        //画段落
        if (gravityType == HORIZONTAL) {
            switch (horizontalGravity) {
                case LEFT:
                    drawHorLeftPara(canvas);
                    break;
                case CENTER:
                    drawHorCenterPara(canvas);
                    break;
                case RIGHT:
                    drawHorRightPara(canvas);
                    break;
            }
        } else if (gravityType == VERTICAL) {
            switch (verticalGravity) {
                case TOP:
                    drawVerTopPara(canvas);
                    break;
                case CENTER:
                    drawVerCenterPara(canvas);
                    break;
                case BOTTOM:
                    drawVerBottomPara(canvas);
                    break;
            }
        }
    }

    private void drawVerTopPara(Canvas canvas) {
        for (int i = 0; i < lineCount; i++) {
            float startX = leftMargen;
            float startY = topMargen + (diverHeight + lineHeight) * (i + 1);
            float stopX = width - leftMargen;
            float stopY = topMargen + (diverHeight + lineHeight) * (i + 1);
            if (i == 0 || i == 1)
                canvas.drawLine(startX, startY, stopX, stopY, paint);
        }
    }

    private void drawVerCenterPara(Canvas canvas) {
        float startX = leftMargen;
        float startY;
        float stopX = width - leftMargen;
        float stopY;

        startY = height / 2 - diverHeight / 2 - lineHeight / 2;
        stopY = height / 2 - diverHeight / 2 - lineHeight / 2;
        canvas.drawLine(startX, startY, stopX, stopY, paint);
        startY = height / 2 + diverHeight / 2 + lineHeight / 2;
        stopY = height / 2 + diverHeight / 2 + lineHeight / 2;
        canvas.drawLine(startX, startY, stopX, stopY, paint);
    }

    private void drawVerBottomPara(Canvas canvas) {
        for (int i = 0; i < lineCount; i++) {
            float startX = leftMargen;
            float startY = topMargen + (diverHeight + lineHeight) * (i + 1);
            float stopX = width - leftMargen;
            float stopY = topMargen + (diverHeight + lineHeight) * (i + 1);
            if (i == 3 || i == 4)
                canvas.drawLine(startX, startY, stopX, stopY, paint);
        }
    }

    private void drawHorLeftPara(Canvas canvas) {
        float startX;
        float startY;
        float stopX = 0;
        float stopY;

        for (int i = 0; i < lineCount; i++) {
            startX = leftMargen;
            startY = topMargen + (diverHeight + lineHeight) * (i + 1);
            if (i == 0) {
                stopX = width - leftMargen * 2;
            } else if (i == 1) {
                stopX = width - leftMargen * 4;
            } else if (i == 2) {
                stopX = width - leftMargen * 3;
            } else if (i == 3) {
                stopX = width - leftMargen * 2;
            } else if (i == 4) {
                stopX = width - leftMargen * 1;
            }

            stopY = topMargen + (diverHeight + lineHeight) * (i + 1);
            canvas.drawLine(startX, startY, stopX, stopY, paint);
        }
    }

    private void drawHorCenterPara(Canvas canvas) {
        for (int i = 0; i < lineCount; i++) {
            float startX = leftMargen;
            float startY = topMargen + (diverHeight + lineHeight) * (i + 1);
            float stopX = width - leftMargen;
            float stopY = topMargen + (diverHeight + lineHeight) * (i + 1);

            canvas.drawLine(startX, startY, stopX, stopY, paint);
        }
    }

    private void drawHorRightPara(Canvas canvas) {
        float startX = 0;
        float startY;
        float stopX;
        float stopY;

        for (int i = 0; i < lineCount; i++) {
            startY = topMargen + (diverHeight + lineHeight) * (i + 1);
            if (i == 0) {
                startX = leftMargen * 2;
            } else if (i == 1) {
                startX = leftMargen * 4;
            } else if (i == 2) {
                startX = leftMargen * 3;
            } else if (i == 3) {
                startX = leftMargen * 2;
            } else if (i == 4) {
                startX = leftMargen * 1;
            }
            stopX = width - leftMargen;
            stopY = topMargen + (diverHeight + lineHeight) * (i + 1);
            canvas.drawLine(startX, startY, stopX, stopY, paint);
        }
    }

    public static int dp2px(Context context,float dpValue){
        float scale = context.getResources().getDisplayMetrics().density;
        return (int)(dpValue * scale + 0.5f);
    }
    
    OnClickListener l;

    @Override
    public void setOnClickListener(@Nullable OnClickListener l) {
        super.setOnClickListener(l);
        this.l = l;
    }
}
上一篇下一篇

猜你喜欢

热点阅读