自定义View实现点击事件

简介: 自定义View实现点击事件

1.自定义View的实现


继承自View 重写 onDraw方法

public class MyLine extends View {
    Paint mPaint;
    int startX;
    int startY;
    int endX;
    int endY;
    public static Point mPoint1;
    public static Point mPoint2;
    public MyLine(Context context) {
        super(context);
        initPaint();
    }
    public MyLine(Context context,
            @Nullable AttributeSet attrs) {
        super(context, attrs);
        initPaint();
        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyLine);
        startX = ta.getInteger(R.styleable.MyLine_startX,100);
        startY = ta.getInteger(R.styleable.MyLine_startY, 100);
        endX = ta.getInteger(R.styleable.MyLine_endX,100);
        endY = ta.getInteger(R.styleable.MyLine_endY, 100);
        mPoint1 = new Point(startX,startY);
        mPoint2 = new Point(endX,endY);
    }
    public static Point getPoint1() {
        return mPoint1;
    }
    public static Point getPoint2() {
        return mPoint2;
    }
    public MyLine(Context context,
            @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initPaint();
    }
    public MyLine(Context context,
            @Nullable AttributeSet attrs, int defStyleAttr,
            int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        initPaint();
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawLine(startX,startY,endX,endY,mPaint);
    }
    public void initPaint(){
        mPaint = new Paint();
        mPaint.setColor(Color.BLUE);
        mPaint.setAntiAlias(true);
        mPaint.setStrokeWidth(10);
    }
}

2.自定义View 自定义属性


在values文件夹下创建attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyPoint">
        <attr name="X" format="integer"/>
        <attr name="Y" format="integer"/>
    </declare-styleable>
    <declare-styleable name="MyLine">
        <attr name="startX" format="integer"/>
        <attr name="endX" format="integer"/>
        <attr name="startY" format="integer"/>
        <attr name="endY" format="integer"/>
    </declare-styleable>
</resources>

获取属性

TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyLine);
        startX = ta.getInteger(R.styleable.MyLine_startX,100);
        startY = ta.getInteger(R.styleable.MyLine_startY, 100);
        endX = ta.getInteger(R.styleable.MyLine_endX,100);
        endY = ta.getInteger(R.styleable.MyLine_endY, 100);

3.添加点击事件


在自定义view的类里添加触摸事件和点击事件的接口

   

@Override
    public boolean onTouchEvent(MotionEvent event) {
        int x = (int) event.getX();
        int y = (int) event.getY();
        int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_UP:
                if (x + getLeft() < getRight() && y + getTop() < getBottom()) {
                    mPoint = new Point(x,y);
                    mViewClick.onClick(x,y,mOnViewClick);
                }
                break;
        }
        return true;
    }
    public void setOnViewClick(onViewClick click) {
        this.mViewClick = click;
    }
    public interface onViewClick {
        void onClick(int scrollX, int scrollY,onViewClick onViewClick);
    }
    onViewClick mOnViewClick = new onViewClick() {
        @Override
        public void onClick(int scrollX, int scrollY, onViewClick onViewClick) {
           sX = scrollX;
           sY = scrollY;
           invalidate();// 重绘 会重新调用onDraw方法
        }
    };
mMyPoint = findViewById(R.id.point);
mMyPoint.setOnViewClick(mMyPoint.mOnViewClick);

4.绘制虚线


mPaint.setPathEffect(new DashPathEffect(new float[] {30, 5}, 0)); 其中30 表示实线的长度 5代表空白的长度


5.已知直线和直线外一点,获取垂足坐标


//
//    private Point getFoot(Point p1,Point p2,Point p3){
//        Point foot=new Point();
//
//        float dx=p1.x-p2.x;
//        float dy=p1.y-p2.y;
//        Log.e("TAG",dx+"     "+dy);
//        float u=(p3.x-p1.x)*dx+(p3.y-p1.y)*dy;
//        u/=dx*dx+dy*dy;
//
//        foot.x=(int)(p1.x+u*dx);
//        foot.y=(int)(p1.y+u*dy);
//
//        float d=Math.abs((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
//        float d1=Math.abs((p1.x-foot.x)*(p1.x-foot.x)+(p1.y-foot.y)*(p1.y-foot.y));
//        float d2=Math.abs((p2.x-foot.x)*(p2.x-foot.x)+(p2.y-foot.y)*(p2.y-foot.y));
//
//        if(d1>d||d2>d){
//            if (d1>d2)  return p2;
//            else return p1;
//        }
//
//        return foot;
//    }
    private Point getFoot(Point p1,Point p2,Point p3){
        Point foot=new Point();
        float dx=p1.x-p2.x;
        float dy=p1.y-p2.y;
        float u=(p3.x-p1.x)*dx+(p3.y-p1.y)*dy;
        u/=dx*dx+dy*dy;
        foot.x=(int)(p1.x+u*dx);
        foot.y=(int)(p1.y+u*dy);
        return foot;
    }


目录
相关文章
SwipeRefreshLayout 下拉刷新控件(二)
SwipeRefreshLayout 下拉刷新控件(二)
SwipeRefreshLayout 下拉刷新控件(一)
SwipeRefreshLayout 下拉刷新控件(一)
解决ListView显示不全、滑动冲突问题
解决ListView显示不全、滑动冲突问题
ScrollView和HorizontalScrollView无法设置点击事件的源码解析
最近的开发过程中,发现存在ScrollView和HorizontalScrollView无法设置点击事件的现象。 我们知道,通常在设置点击事件时,位于View树上方的子View的OnClickListener,会优先于父View的OnClickListener执行。 开发过程中我们会经常使用类似的方式来给布局设置点击事件,比如给ListView的Item背景设置OnClickListener,用于点击item空白区域的跳转操作;然后再给item内部的子元素分别设置OnClickListener用于各自不同的点击操作。
|
前端开发 Android开发
自定义View实例(三)----滑动刻度尺与流式布局
最近在系统学习自定义View这一块的知识,前面几篇基本都是理论知识,这篇博客着重从实战来加强对自定义View的理解与运用。实现的两种效果,分别代表自定义View与自定义ViewGroup。
1301 0
|
容器
自定义View
自定义View 画一个实心圆 效果图 创建attrs.xml文件 初始化样式属性 支持Padding属性 支持wrap_content属性 布局文件中的应用 画一个带外圆环的圆 效果图 创建attrs.xml文件 初始化样式属性 内圆与外圆环的绘制 布局文件中的应用 画一个外圆环可根据数值变动的圆 效果图 创建attrs.xml文件 初始化样式属性 绘制View 提供方法修改样式 布局文件中的应用
自定义View
|
前端开发 Android开发
3.6 自定义View (3.6.1)
本文对应项目的码云地址:https://gitee.com/wanchuanxy/AndroidHeroesTest/tree/master/3/SystemWidget Android给我们提供了丰富的组件库来创建丰富的UI效果,同时也提供了非常方便的拓展方法。
731 0
|
XML Android开发 数据格式
3.6 自定义View (3.6.2)
本文对应项目的码云地址:https://gitee.com/wanchuanxy/AndroidHeroesTest/tree/master/3/SystemWidget 3.6.2 创建复合控件 创建复合控件可以很好地创建出具有重用功能的控件集合。
654 0
|
程序员 Android开发
有关自定义View的学习(View的点击事件传递流程)
1、安卓OnTouchListener,onTouchEvent,onClickListener执行顺序 首先我们相对比较熟悉的是处理滑动冲突时候的三个事件(ViewGroup 继承 View) (View是没有onInterceptTouchEvent方法的),先看看ViewGroup和View的事件流程方法: ViewGroup 1.
1174 0