自定义View(Path,Bitmap,Slider)

1、Path

public class MyPath extends View {
    private int width;
    private int height;
    private Path mPath;
    private Paint mPaint;
    private Paint mPaintNew;
    private int count = 0;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 0x23:
                    count+=10;
                    if(count>80){//注意这里的count值要>80
                        count=0;
                    }
                    invalidate();
                    handler.sendEmptyMessageDelayed(0x23, 20);
                    break;
            }

        }
    };

    public MyPath(Context context) {
        super(context);
    }

    public MyPath(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaint = new Paint();
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setTextSize(20);
        //      mPaint.setStrokeWidth(5);
        mPaint.setAntiAlias(true);//去锯齿

        mPaintNew = new Paint();
        mPaintNew.setColor(Color.RED);
        mPaintNew.setStrokeWidth(5);
        mPaintNew.setStyle(Paint.Style.STROKE);
        mPath = new Path();
        handler.sendEmptyMessage(0x23);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
        height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
        setMeasuredDimension(width, height);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //画三角形
        mPath.moveTo(100, 100);
        mPath.lineTo(0, 200);
        mPath.lineTo(200, 200);
        mPath.close();
        canvas.drawPath(mPath, mPaint);
        canvas.drawTextOnPath("在三角形边上写点啥呢", mPath, 50, 20, mPaint);
        //画圆
        mPath.addCircle(width/2,height/2,300,Path.Direction.CW);
        canvas.drawPath(mPath,mPaint);
        canvas.drawTextOnPath("在这里我要写点啥呢",mPath,1000,50,mPaint);//1000文字开始写的偏移,50文字相对圆的上下偏移
        //画贝塞尔曲线
        mPath.moveTo(100,100);//起始点坐标
        mPath.quadTo(100, 400, 300, 300);//控制点坐标,结束点坐标
        canvas.drawPath(mPath, mPaint);
        canvas.drawPoint(100, 100, mPaint);
        canvas.drawPoint(100,400,mPaint);
        canvas.drawPoint(300,300,mPaint);
        //波浪
        mPath.reset();
        mPath.moveTo(count, 100);
       for(int i =0;i<10;i++) {
           mPath.rQuadTo(20, 5, 40, 0);//一个完整的波浪长度为80
           mPath.rQuadTo(20, -5, 40, 0);
       }
        canvas.drawPath(mPath, mPaint);
        canvas.drawCircle(300, 100, 50, mPaintNew);
    }
}

三角形
这里写图片描述
贝塞尔曲线
这里写图片描述

这里写图片描述

2、BitmapView

public class BitmapView extends View {
    private int width;
    private int height;
    private Bitmap mBitmap;
    private Paint mPaint;
    private Matrix matrix;
    private int imageWidth;
    private int imageHeight;

    public BitmapView(Context context) {
        super(context);
    }

    public BitmapView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.hh);
        mPaint = new Paint();
        matrix = new Matrix();
        imageWidth = mBitmap.getWidth();
        imageHeight = mBitmap.getHeight();
        Log.d("图片的高: " + mBitmap.getHeight(), "图片的宽: " + mBitmap.getWidth());
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
        height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
        setMeasuredDimension(width, height);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //   canvas.drawBitmap(mBitmap,50,100,mPaint);//将图片画入
        matrix.reset();
        matrix.postScale(2, 2);//x,y轴各放大两倍
        canvas.drawBitmap(mBitmap, matrix, mPaint);
        matrix.reset();
        canvas.drawBitmap(mBitmap, matrix, mPaint);//把原图再画到放大的图片上

        matrix.reset();
        matrix.postTranslate(0, imageHeight * 2);//平移,x轴不变,y轴向下平移高的两倍
        canvas.drawBitmap(mBitmap, matrix, mPaint);

        matrix.reset();
        matrix.postRotate(90);//旋转180度
        matrix.postTranslate(imageWidth * 2, imageHeight * 2);//x,y轴都平移两倍
        canvas.drawBitmap(mBitmap, matrix, mPaint);

        matrix.reset();
        float matrix_values[] = {1f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, 1f};//关于x轴对称
        matrix.setValues(matrix_values);
        matrix.postTranslate(0, imageHeight * 2);
        canvas.drawBitmap(mBitmap, matrix, mPaint);

        matrix.reset();
        float matrix_values2[] = {-1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f};//关于y轴对称
        matrix.setValues(matrix_values2);
        matrix.postTranslate(imageWidth * 3, 0);
        canvas.drawBitmap(mBitmap, matrix, mPaint);

        matrix.reset();
        float matrix_values3[] = {1f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, 1f};
        matrix.setValues(matrix_values3);
        matrix.postTranslate(0, imageHeight * 4);
        matrix.postTranslate(imageWidth * 2, 0);
        matrix.postScale(2, 2,imageWidth*2, imageHeight *3);//以imageWidth*2, imageHeight *3点放大
        canvas.drawBitmap(mBitmap, matrix, mPaint);
    }
}

处理如下:
这里写图片描述

public class BitmapView2 extends View {
    private int width;
    private int height;
    private Paint mPaintCircle;
    private  Paint mPaintRect;
    private Bitmap mBitmap;
    private Canvas mCanvas;

    public BitmapView2(Context context) {
        super(context);
    }

    public BitmapView2(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaintCircle = new Paint();
        mPaintCircle.setColor(Color.YELLOW);
        mPaintRect = new Paint();
        mPaintRect.setColor(Color.GREEN);

        PorterDuffXfermode mode = new PorterDuffXfermode(PorterDuff.Mode.XOR);//这里可以改变mode来得到不同的效果
        mPaintRect.setXfermode(mode);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
        height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
        setMeasuredDimension(width, height);
        mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        mCanvas = new Canvas(mBitmap);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.GRAY);
        mCanvas.drawCircle(width / 2, height / 2, width / 2, mPaintCircle);
        mCanvas.drawRect(0, 0, width / 2, height / 2, mPaintRect);
        canvas.drawBitmap(mBitmap,0,0,null);
    }
}

运行如下:
这里写图片描述

3、Slider(手机联系人查询)

布局文件

   <com.my.administrator.zdyview.MySlider
        android:id="@+id/view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <TextView
        android:id="@+id/textview"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:textSize="50dp"
        android:layout_centerInParent="true"
        android:gravity="center" />

MySlider类继承 View,重写发放,画相应内容

public class MySlider extends View {
    private int width;
    private int height;
    private Paint mPaintText;
    private Paint mPaintRed;
    private String[] array = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n",
            "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};
    private int index = -1;

    //设置观察者模式
    public interface OnItemSelect {
        public void onItemSelected(int index, String s);
    }

    private OnItemSelect listener;
//添加监听器
    public void setOnItemSelectListener(OnItemSelect listener) {
        this.listener = listener;
    }

    public MySlider(Context context) {
        super(context);
    }

    public MySlider(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaintText = new Paint();
        mPaintText.setTextAlign(Paint.Align.CENTER);
        mPaintRed = new Paint();
        mPaintRed.setColor(Color.RED);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
        height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
        setMeasuredDimension(width, height);
        mPaintText.setTextSize(height / 26f);//每个字的大小是总宽度除以26个字母
        mPaintRed.setTextSize(height / 26f);
    }

    private float x;
    private float y;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_DOWN:
                x = event.getX();
                y = event.getY();
                if (x > width - mPaintText.measureText("m") * 2) {
                    index = (int) y / (height / 26);
                    Log.d("onTouch", "点击了字母" + array[index]);
                    //     Toast.makeText(getContext(), "点击了字母" + array[index], Toast.LENGTH_SHORT).show();
                    if (listener != null) {
                        listener.onItemSelected(index, array[index]);//调用onItemSelected方法
                    }
                    invalidate();
                    return true;
                }
                break;
            case MotionEvent.ACTION_UP:
                index=-1;
                invalidate();
                return true;
        }
        return super.onTouchEvent(event);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for (int i = 0; i < array.length; i++) {
            if (index == i) {
                canvas.drawText("" + array[i], width - mPaintText.measureText("m"), height / 26 * (i + 1), mPaintRed);
            } else {
                canvas.drawText("" + array[i], width - mPaintText.measureText("m"), height / 26 * (i + 1), mPaintText);
            }
        }
    }
}

在Activity中

 private TextView mTextView;
    private MySlider mySlider;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.textview);
        mySlider = (MySlider) findViewById(R.id.view);
        mySlider.setOnItemSelectListener(new MySlider.OnItemSelect() {//调用监听器
            @Override
            public void onItemSelected(int index, String s) {//重写onItemSelected方法
                mTextView.setText(s);
            }
        });

这里写图片描述
触摸到字母时会变红色,同时中间的TextView显示所处的字母

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值