android简单的九宫格解锁view

纯代码绘制view有点粗糙

直接给代码吧,挺简单的

下面是主view代码

package jack.com.mypoint;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Jack on 2014/8/19.
 */
public class MyView extends View {
    private Point[] points = new Point[9];
    private static int POINT_SPACE = 70;
    private static int PADDING_LEFT_RIGHT = 30;
    private static int outer_size = 15;
    private static int outer_stork_size = 3;
    private static int inner_size = 5;
    private static int line_size = 5;
    private boolean isInitPoints = false;
    private boolean isDrawAutoLine = false;
    private boolean isStorkInnerCircle = false;
    private StringBuilder pointIndex = null;

    public MyView(Context context){
            super(context);
        POINT_SPACE = dip2px(context,POINT_SPACE);
        PADDING_LEFT_RIGHT = dip2px(context,PADDING_LEFT_RIGHT);
        outer_size = dip2px(context, outer_size);
        inner_size = dip2px(context, inner_size);
        line_size = dip2px(context, line_size);
        outer_stork_size = dip2px(context,outer_stork_size);

    }
    //每一个点都有些数据,有范围,还有一些状态,根据一些状态判断一些
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int width = canvas.getWidth();
        int height = canvas.getHeight();
        System.out.println("宽度=" + width + "高度=" + height);
        initPoints(width/2,height/2,canvas);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        final int action = event.getAction();

        switch (action){
            case MotionEvent.ACTION_DOWN:
                pointIndex = new StringBuilder();
//                mIndex=null;
                isStorkInnerCircle = false;
//                mIndex = new String();
                isInitPoints=false;
                int x = (int) event.getX();
                int y = (int) event.getY();

                for(int i = 0;i<points.length;i++){
                    points[i].isSelect = false;
                }
                for(int i = 0;i<points.length;i++){
                    //未选中
                        if(points[i].getPointRect().contains(x,y)){
//                            mIndex+=i+"";
                            points[i].isSelect = true;
                            pointIndex.append(i+"");
                            break;
                    }

                }
                break;
            case MotionEvent.ACTION_MOVE:
                isDrawAutoLine = true;
                int moveX = (int) event.getX();
                int moveY = (int) event.getY();
                if(pointIndex.length()>0){
                    String index = pointIndex.toString();
                    int len = index.length();
                    String last = index.substring(len-1,len);
//                    System.out.println("最后的位置"+last);
                    points[Integer.valueOf(last)].moveX = moveX;
                    points[Integer.valueOf(last)].moveY = moveY;
                }
                for(int i = 0;i<points.length;i++){
                    if(points[i].isSelect){
                        //当前点被选中
                        System.out.println("当前选中的点"+i);
                    }else{
                        //未选中点
                        if(points[i].getPointRect().contains(moveX,moveY)){
                            System.out.println("当前添加的点"+i+"---"+points[i].isSelect);
                            //滑动到某一个点的范围里面,记录位置
                            pointIndex.append(i);
//                            mIndex+=i;
                            points[i].isSelect = true;
                        }
                    }
                }
                break;
            case MotionEvent.ACTION_UP:
//                isInitPoints = false;
                isDrawAutoLine = false;
                isStorkInnerCircle = true;
                break;
        }
        postInvalidate();
//        invalidate();
        return true;
    }

    private void initPoints(int width,int height,Canvas canvas){
        if(!isInitPoints){
            System.out.println("初始化");
            POINT_SPACE = width-PADDING_LEFT_RIGHT;
            Point p0 = new Point();
            p0.setPosition(PADDING_LEFT_RIGHT,height-POINT_SPACE);
            points[0] = p0;
            points[1] = new Point().setPosition(width,height-POINT_SPACE);
            points[2] = new Point().setPosition(width*2-PADDING_LEFT_RIGHT,height-POINT_SPACE);
            points[3] = new Point().setPosition(PADDING_LEFT_RIGHT,height);
            points[4] = new Point().setPosition(width,height);
            points[5] = new Point().setPosition(width*2-PADDING_LEFT_RIGHT,height);
            points[6] = new Point().setPosition(PADDING_LEFT_RIGHT,height+POINT_SPACE);
            points[7] = new Point().setPosition(width,height+POINT_SPACE);
            points[8] = new Point().setPosition(width*2-PADDING_LEFT_RIGHT,height+POINT_SPACE);
            isInitPoints = true;
        }
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        if(pointIndex!=null){

            if(pointIndex.length()>0){
                paint.setColor(Color.DKGRAY);
                paint.setStrokeWidth(line_size);
                String index = pointIndex.toString();

                int len = index.length();
                String last = index.substring(len-1,len);
                System.out.println("最后的位置"+len+"----"+last+"---"+index);
                //之前的使用线连接起来
                if(len>1){
                    for(int i=2;i<=len;i++){
                        System.out.println("绘制线条");
                        Point con = points[Integer.valueOf(index.substring(i-1,i))];
                        Point preCon = points[Integer.valueOf(index.substring(i-2,i-1))];
                        canvas.drawLine(preCon.centerX,preCon.centerY,con.centerX,con.centerY,paint);
                    }
                }
                Point p = points[Integer.valueOf(last)];
                if(p.moveX!=0||p.moveY!=0){
                    if(isDrawAutoLine){
                        p.drawLine(canvas,paint,p);
                    }else{
                        System.out.println("顺心--->"+index);
                    }
                }
                paint.reset();
            }
        }
        for(int i = 0;i<points.length;i++){

            if(points[i].isSelect){
                paint.setStyle(Paint.Style.STROKE);
                paint.setStrokeWidth(outer_stork_size);
                paint.setColor(Color.CYAN);
                canvas.drawCircle(points[i].centerX,points[i].centerY,outer_size,paint);
                paint.reset();
            }

            if(isStorkInnerCircle&&points[i].isSelect){
                paint.setColor(Color.GREEN);
                paint.setStyle(Paint.Style.STROKE);
                paint.setStrokeWidth(2);
                canvas.drawCircle(points[i].centerX,points[i].centerY,inner_size,paint);
                paint.reset();
            }else{
                paint.setColor(Color.GREEN);
                canvas.drawCircle(points[i].centerX,points[i].centerY,inner_size,paint);
            }

        }
    }


    /**
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
     */
    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
     */
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

}
</pre><pre name="code" class="java">
下面是每个点的信息和代码
<pre name="code" class="java">package jack.com.mypoint;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;

/**
 * Created by Jack on 2014/8/20.
 */
public class Point {
    public int preX;
    public int preY;
    public int centerX;
    public int centerY;
    private int innerRadio;
    private int storkRadio;
    public boolean isSelect = false;//默认未选中

    public int moveX;
    public int moveY;


    public Point setPosition(int centerX,int centerY){
        this.centerX = centerX;
        this.centerY = centerY;
        return this;
    }

    public void setRadioSize(int innerRadio,int storkRadio){
        this.innerRadio = innerRadio;
        this.storkRadio = storkRadio;
    }


    public RectF getPointRect(){
        return  new RectF(centerX-40,centerY-40,centerX+40,centerY+40);
    }


    public void drawLine(Canvas canvas,Paint paint,Point point){
        canvas.drawLine(point.centerX,point.centerY,moveX,moveY,paint);
    }
}

好了,这样简单的九个点点就出来了,具体怎么运用看要求了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值