美文网首页
自定义SwitchView

自定义SwitchView

作者: 贝贝beibei96 | 来源:发表于2018-04-20 21:44 被阅读24次

词穷, 懒得写铺垫, 直接上效果

SwitchView.gif

xml引用

<cn.startrails.webblintestdemo.widget.SmilingFaceView
            android:id="@+id/sfv_test"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toTopOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

在control里添加监听

mBD.sfvTest.setStateListener(state -> {
            if (state == SmilingFaceView.State.ON) {
                // do something
            } else {
                // do something
            }
        });

java代码

package cn.startrails.webblintestdemo.widget;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

import cn.startrails.webblintestdemo.R;

/**
 * @author WebbLin(林恩)
 * @date 2018/4/18  15:56
 * @email Webb@starcc.cc
 */

public class SmilingFaceView extends View {

    /**
     * 画笔
     */
    private Paint mPaint;

    /**
     * 圆角矩形
     */
    private RectF mRectF;

    /**
     * 圆角半径 rx ry
     */
    private float radius;

    /**
     * 位图
     */
    private Bitmap mBitmap;

    /**
     * bitmap 的间距
     */
    private int bitSpc;

    /**
     * 移动的距离
     */
    private int translateX;

    /**
     * 默认为关
     */
    private State mState = State.OFF;

    private StateListener mStateListener;


    public SmilingFaceView(Context context) {
        super(context);
        init();

    }

    public SmilingFaceView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();

    }

    public SmilingFaceView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();

    }


    public enum State {
        ON,
        OFF
    }

    private void init() {
        setLayerType(LAYER_TYPE_SOFTWARE, null);
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setAntiAlias(true);
        mPaint.setColor(Color.WHITE);

    }


    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        /*
         * 圆角矩形大小和位置
         */
        float top;
        float left = top = 10;
        float right = w - 10;
        float bottom = h - 10;
        // View高
        float height = bottom - top;
        // 矩形
        mRectF = new RectF(left, top, right, bottom);
        // 半径
        radius = bottom - top;
        // 位图
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.synthetic1_100);
        mBitmap = Bitmap.createScaledBitmap(bitmap,
                (int) height - 8, (int) height - 8, true);
        bitSpc = (h - mBitmap.getHeight()) / 2;
        translateX = w - (mBitmap.getWidth() + 28);

    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        mPaint.setStyle(Paint.Style.FILL);
        // 绘制背景圆角矩形
        canvas.drawRoundRect(mRectF, radius, radius, mPaint);

        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(8);
        mPaint.setColor(getResources().getColor(R.color.bluegrey300));
        // 绘制阴影圆角矩形
        canvas.drawRoundRect(mRectF, radius, radius, mPaint);

        canvas.save();
        if (mState != State.OFF) {
            canvas.translate(translateX, 0);
            mPaint.setColor(Color.WHITE);

        } else {
            mPaint.setColor(getResources().getColor(R.color.greena700));

        }
        // 绘制位图
        canvas.drawBitmap(mBitmap, bitSpc, bitSpc, mPaint);
        canvas.restore();

    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        // 宽高比
        int heightSize = (int) (widthSize * 0.65f);
        setMeasuredDimension(widthSize, heightSize);

    }


    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_UP:
                // 关闭状态
                if (mState == State.OFF) {
                    mState = State.ON;
                    if (mStateListener != null)
                        mStateListener.onState(mState);
                    postInvalidate();
                    // 打开状态
                } else {
                    mState = State.OFF;
                    if (mStateListener != null)
                        mStateListener.onState(mState);
                    postInvalidate();
                }

                break;
        }

        return true;
    }


    /**
     * 状态监听
     */
    public interface StateListener {
        void onState(State state);
    }


    public StateListener getStateListener() {
        return mStateListener;
    }


    public void setStateListener(StateListener stateListener) {
        mStateListener = stateListener;
    }
}

相关文章

  • 状态切换自定义View

    SwitchView 项目介绍 用于状态切换,支持随意状态个数、自定义Drawable样式。 源代码:https:...

  • 自定义开关按钮控件SwitchView

    在讲解自定义SwitchView之前 先讲解一下自定义View的基本步骤 1 .有些自定义需要定义View的属性如...

  • 自定义SwitchView

    词穷, 懒得写铺垫, 直接上效果 xml引用 在control里添加监听 java代码

  • 自定义View之SwitchView

    工作(我)太(太)忙(懒) 太长时间没有写博客了,再不写今年一晃就要过去了,顺便也总结下今年工作的一些技术点吧。这...

  • SwitchView

    今天写了一个很简单的开关控件,仿华为手机的,先看效果图 ... 这是华为的 这是我的 代码 很简单的 packag...

  • 自定义View -简单的 SwitchView

    前言 实现一个简单的滑动开发,效果图如下: 分析 平分整个View为两份 测量字体的高度和宽度,确定左右View的...

  • iOS--写一个可以自定义图片的SwitchView

    好久不写UI、正好项目里遇到一个需要自定义图片的SwitchView。写了写封装了一下、感觉挺有意思干脆贴出来好了...

  • Dialog

    安卓dialog的使用+如何自定义dialog自定义Dialog自定义Dialog 自定义

  • django的自定义filter和自定义simple_tag

    django的自定义filter和自定义simple_tag 自定义filter: 自定义filter: 简单示例...

  • 自定义tabbarController

    要自定义tabBarController,就要自定义tabBar.要自定义tabBar就要自定义item.所以,咱...

网友评论

      本文标题:自定义SwitchView

      本文链接:https://www.haomeiwen.com/subject/qqazkftx.html