Java 在android中创建具有两层的自定义视图

Java 在android中创建具有两层的自定义视图,java,android,android-custom-view,Java,Android,Android Custom View,我必须在android中创建一个自定义视图,如图所示 ,我找到了一个例子 public class SmallCircleView extends View{ private Paint smallCircleCore; private Paint lineCore; private Paint bigArc; private Paint bigArcDraw; private Paint pencil; private Paint middl

我必须在android中创建一个自定义视图,如图所示

,我找到了一个例子

public class SmallCircleView extends View{

    private Paint smallCircleCore;
    private Paint lineCore;
    private Paint bigArc;
    private Paint bigArcDraw;
    private Paint pencil;
    private Paint middleCircleBody;
    private Paint arcTouchedBack;
    private Paint circlePaint;

    private int initial, midInitial;
    private int finalangle;
    private int middleCircleRadius;
    private int i =0;

    private int centerCircleradius;

    int[] colors = new int[]{0xFF33B5E5,
            0xFFAA66CC,
            0xFF99CC00,
            0xFFFFBB33,
            0xFFFF4444,
            0xFF0099CC,
            0xFFAA66CC,
            0xFF669900,
            0xFFFF8800,
            0xFFCC0000};

    private RectF oval = new RectF();
    private RectF middleOval = new RectF();
    private RectF finalOVal = new RectF();

    private Context context;
    private int px, py;

    private boolean isClicked = true;
    private boolean[] arcTouched= new boolean[]{false, false, false, false, false};

    EmbossMaskFilter emboss;
    EmbossMaskFilter forBig;

    private ArrayList<Bitmap> bitmap = new ArrayList<Bitmap>();

    public SmallCircleView(Context context) {
        super(context);
        this.context = context;
        initSmallCircle();

        // TODO Auto-generated constructor stub
    }

    public SmallCircleView(Context context, AttributeSet attri)
    {
        super(context, attri);
        this.context = context;

        initSmallCircle();
    }

    public SmallCircleView(Context context, AttributeSet attri, int defaultStyle)
    {
        super(context, attri, defaultStyle);
        this.context = context;

        initSmallCircle();
    }

    private void initSmallCircle()
    {
        setFocusable(true);

        smallCircleCore = new Paint(Paint.ANTI_ALIAS_FLAG);
        lineCore = new Paint(Paint.ANTI_ALIAS_FLAG);
        bigArc = new Paint(Paint.ANTI_ALIAS_FLAG);
        pencil = new Paint(Paint.ANTI_ALIAS_FLAG);

        lineCore.setColor(0xFFFFFFFF);
        lineCore.setStyle(Paint.Style.FILL);
        lineCore.setStrokeWidth(4);
        //bigCircleCore.setStrokeWidth(5);

        smallCircleCore.setStyle(Paint.Style.FILL);
        smallCircleCore.setColor(0xFFFFFFFF);

        bigArc.setColor(0xFF424242);
        bigArc.setStyle(Paint.Style.FILL);

        bigArcDraw = new Paint(smallCircleCore);
        bigArcDraw.setStrokeWidth(4);
        bigArcDraw.setColor(0xFF000000);

        pencil.setStrokeWidth(0.5f);
        pencil.setColor(0x80444444);
        pencil.setStyle(Paint.Style.STROKE);

        middleCircleBody = new Paint(bigArc);
        middleCircleBody.setColor(0xFFE6E6E6);

        arcTouchedBack = new Paint(Paint.ANTI_ALIAS_FLAG);
        arcTouchedBack.setColor(0xFF81DAF5);
        arcTouchedBack.setStyle(Paint.Style.FILL);      

        circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        circlePaint.setStyle(Paint.Style.STROKE);
        circlePaint.setStrokeWidth(10);



        float[] direection = new float[]{1,1,1};
        float light = 0.4f;
        float specualr = 6;
        float blur = 3.5f;      

        emboss = new EmbossMaskFilter(direection, light, specualr, blur);
        forBig = new EmbossMaskFilter(direection, 1f, 4, 2.5f);

        bitmap.clear();
        bitmap.add(BitmapFactory.decodeResource(getResources(), R.drawable.tasks));
        bitmap.add(BitmapFactory.decodeResource(getResources(), R.drawable.file_manager));
        bitmap.add(BitmapFactory.decodeResource(getResources(), R.drawable.home));
        bitmap.add(BitmapFactory.decodeResource(getResources(), R.drawable.contacts));      
        bitmap.add(BitmapFactory.decodeResource(getResources(), R.drawable.reminder));


        middleCircleBody.setMaskFilter(forBig);
        bigArc.setMaskFilter(forBig);

        String log="";
        Log.d(log, "Value of px & py " + getMeasuredWidth() + " " + getMeasuredHeight());
    }

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        int measuredWidth = measure(widthMeasureSpec);
        int measuredHeight = measure(heightMeasureSpec);

        int d = Math.min(measuredWidth, measuredHeight);

        setMeasuredDimension(d,d);
    }

    private int measure(int measureSpec)
    {
        int result = 0;

        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);

        if(specMode == MeasureSpec.UNSPECIFIED)
        {
            result = 200;
        }
        else
        {
            result = specSize;
        }

        return result;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub

        px = getMeasuredWidth()/2;
        py = getMeasuredHeight();


        initial = 144;
        finalangle = 252;

        centerCircleradius  = 30;
        middleCircleRadius = 140;




            int init, fina;
            init = 160;
            fina = 360;
            finalOVal.set(px-middleCircleRadius-4, py-middleCircleRadius-4, px+middleCircleRadius+4, py+middleCircleRadius+4);
            middleOval.set(px-middleCircleRadius, py-middleCircleRadius, px+middleCircleRadius, py+middleCircleRadius);
            while(init<fina)
            {
                circlePaint.setColor(colors[i]);
                canvas.drawArc(finalOVal,init,10,false, circlePaint);
                i++;
                if(i>=colors.length)
                {
                    i=0;
                }
                init = init + 10;

            }
            //Setting Mask Filter


            canvas.drawArc(middleOval, 180, 180, false, pencil);

            midInitial = 180;


            i=0;

            //Creating the first Arc
            if(arcTouched[0])
            {

                canvas.drawArc(middleOval, midInitial, 36, true, arcTouchedBack);
                canvas.drawArc(middleOval, midInitial, 36, true, pencil);
            }
            else
            {
                canvas.drawArc(middleOval, midInitial, 36, true, middleCircleBody);
                canvas.drawArc(middleOval, midInitial, 36, true, pencil);
            }
            canvas.drawBitmap(bitmap.get(0), null, (putBitmapTo(midInitial, 36, 140, px, py)), null);
            midInitial+=36;

            if(arcTouched[1])
            {

                canvas.drawArc(middleOval, midInitial, 36, true, arcTouchedBack);
                canvas.drawArc(middleOval, midInitial, 36, true, pencil);
            }
            else
            {
                canvas.drawArc(middleOval, midInitial, 36, true, middleCircleBody);
                canvas.drawArc(middleOval, midInitial, 36, true, pencil);
            }
            canvas.drawBitmap(bitmap.get(1), null, (putBitmapTo(midInitial, 36, 140, px, py)), null);
            midInitial+=36;

            if(arcTouched[2])
            {

                canvas.drawArc(middleOval, midInitial, 36, true, arcTouchedBack);
                canvas.drawArc(middleOval, midInitial, 36, true, pencil);
            }
            else
            {
                canvas.drawArc(middleOval, midInitial, 36, true, middleCircleBody);
                canvas.drawArc(middleOval, midInitial, 36, true, pencil);
            }
            canvas.drawBitmap(bitmap.get(2), null, (putBitmapTo(midInitial, 36, 140, px, py)), null);
            midInitial+=36;
            //Creatring the second Arc

            if(arcTouched[3])
            {

                canvas.drawArc(middleOval, midInitial, 36, true, arcTouchedBack);
                canvas.drawArc(middleOval, midInitial, 36, true, pencil);
            }
            else
            {
                canvas.drawArc(middleOval, midInitial, 36, true, middleCircleBody);
                canvas.drawArc(middleOval, midInitial, 36, true, pencil);
            }
            canvas.drawBitmap(bitmap.get(3), null, (putBitmapTo(midInitial, 36, 140, px, py)), null);
            midInitial+=36;

            if(arcTouched[4])
            {

                canvas.drawArc(middleOval, midInitial, 36, true, arcTouchedBack);
                canvas.drawArc(middleOval, midInitial, 36, true, pencil);
            }
            else
            {
                canvas.drawArc(middleOval, midInitial, 36, true, middleCircleBody);
                canvas.drawArc(middleOval, midInitial, 36, true, pencil);
            }
            canvas.drawBitmap(bitmap.get(4), null, (putBitmapTo(midInitial, 36, 140, px, py)), null);           
            canvas.drawCircle(px, py-10, 40, pencil);
            canvas.drawCircle(px, py-10, 39, smallCircleCore);

            canvas.drawCircle(px, py-10, 35, bigArc);
            canvas.drawCircle(px, py-10, 20, smallCircleCore);

            canvas.drawCircle(px, py-10, 15, bigArc);
            canvas.drawLine(px-8, py-10, px+8, py-10, lineCore);

        canvas.save();
    }



    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub

        float centerX = px;
        float centerY = (py-centerCircleradius+(centerCircleradius/4));

        switch(event.getAction())
        {
            case MotionEvent.ACTION_DOWN:
            {
                if(isInSideCenterCircle(centerX, centerY, centerCircleradius, event.getX(), event.getY()))
                {
                    return super.onTouchEvent(event);
                }
                if(isInArc(180, 36, middleCircleRadius, px, py, event.getX(), event.getY()))
                {

                    makeAllFalse();
                    arcTouched[0] = true;
                    invalidate();
                    return true;
                }

                if(isInArc(216, 36, middleCircleRadius, px, py, event.getX(), event.getY()))
                {

                    makeAllFalse();
                    arcTouched[1] = true;
                    invalidate();
                    return true;
                }

                if(isInArc(252, 36, middleCircleRadius, px, py, event.getX(), event.getY()))
                {

                    makeAllFalse();
                    arcTouched[2] = true;
                    invalidate();
                    return true;
                }

                if(isInArc(288,36, middleCircleRadius, px, py, event.getX(), event.getY()))
                {

                    makeAllFalse();
                    arcTouched[3] = true;
                    invalidate();
                    return true;
                }

                if(isInArc(324, 36, middleCircleRadius, px, py, event.getX(), event.getY()))
                {

                    makeAllFalse();
                    arcTouched[4] = true;
                    invalidate();
                    return true;
                }
            }
            case MotionEvent.ACTION_UP:
            {


                if(isInSideCenterCircle(centerX, centerY, centerCircleradius, event.getX(), event.getY()))
                {
                    return super.onTouchEvent(event);
                }

                if(isInArc(180, 36, middleCircleRadius, px, py, event.getX(), event.getY()))
                {
                    Toast.makeText(getContext(), "In the first Arc !!!", Toast.LENGTH_SHORT).show();
                    makeAllFalse();

                    invalidate();
                    return false;
                }

                if(isInArc(216, 36, middleCircleRadius, px, py, event.getX(), event.getY()))
                {
                    Toast.makeText(getContext(), "In Second Arc", Toast.LENGTH_SHORT).show();
                    makeAllFalse();

                    invalidate();
                    return false;
                }

                if(isInArc(252, 36, middleCircleRadius, px, py, event.getX(), event.getY()))
                {
                    Toast.makeText(getContext(), "In Third Arc", Toast.LENGTH_SHORT).show();
                    makeAllFalse();

                    invalidate();
                    return false;
                }

                if(isInArc(288,36, middleCircleRadius, px, py, event.getX(), event.getY()))
                {
                    Toast.makeText(getContext(), "In fourth Arc", Toast.LENGTH_SHORT).show();
                    makeAllFalse();

                    invalidate();
                    return false;
                }

                if(isInArc(324, 36, middleCircleRadius, px, py, event.getX(), event.getY()))
                {
                    Toast.makeText(getContext(), "In Fifth Arc", Toast.LENGTH_SHORT).show();
                    makeAllFalse();

                    invalidate();
                    return false;
                }

                else
                {
                    makeAllFalse();
                    invalidate();
                    return super.onTouchEvent(event);
                }
            }
            case MotionEvent.ACTION_MOVE:
            {
                if(isInSideCenterCircle(centerX, centerY, centerCircleradius, event.getX(), event.getY()))
                {
                    makeAllFalse();
                    invalidate();
                    return super.onTouchEvent(event);
                }

                if(isInArc(180, 36, middleCircleRadius, px, py, event.getX(), event.getY()))
                {

                    makeAllFalse();
                    arcTouched[0] = true;
                    invalidate();
                    return false;
                }

                if(isInArc(216, 36, middleCircleRadius, px, py, event.getX(), event.getY()))
                {

                    makeAllFalse();
                    arcTouched[1] = true;
                    invalidate();
                    return false;
                }

                if(isInArc(252, 36, middleCircleRadius, px, py, event.getX(), event.getY()))
                {

                    makeAllFalse();
                    arcTouched[2] = true;
                    invalidate();
                    return false;
                }

                if(isInArc(288,36, middleCircleRadius, px, py, event.getX(), event.getY()))
                {

                    makeAllFalse();
                    arcTouched[3] = true;
                    invalidate();
                    return false;
                }

                if(isInArc(324, 36, middleCircleRadius, px, py, event.getX(), event.getY()))
                {

                    makeAllFalse();
                    arcTouched[4] = true;
                    invalidate();
                    return false;
                }

                else
                {
                    makeAllFalse();
                    invalidate();
                    return super.onTouchEvent(event);
                }
            }
        }
        return super.onTouchEvent(event);
    }

    private boolean isInSideCenterCircle(float centerX, float centerY, float radius, float co_ordinateX, float co_ordinateY)
    {       
        return ((Math.pow((centerX-co_ordinateX),2))+(Math.pow((centerY-co_ordinateY),2))-Math.pow(radius, 2))<=0;      
    }

    private void changeIsClicked()
    {
        isClicked =(isClicked?(false):(true));
    }

    private RectF putBitmapTo(int startAngle, int SweepAngle, float radius, float centerX, float centerY)
    {
        float locx = (float) (centerX +((radius/17*11)*Math.cos(Math.toRadians(
                                                         (startAngle+SweepAngle+startAngle)/2
                                                         ))
                                                         ));
        float locy = (float) (centerY + ((radius/17*11)*Math.sin(Math.toRadians(
                                                         (startAngle+SweepAngle+startAngle)/2
                                                         ))
                                                         ));

        return new RectF(locx-20, locy-20, locx+20, locy+20);   

    }

    private boolean isInArc(int startAngle, int SweepAngle, float radius, float centerX, float centerY, float toCheckX, float toCheckY)
    {

        double degree;

        if(
           (Math.pow(centerX - toCheckX, 2) + 
           Math.pow(centerY - toCheckY, 2) -
           Math.pow(radius, 2))<=0)
        {           
            double radian = Math.atan((centerY-toCheckY)/(centerX-toCheckX));
            if(radian<0)                
            {
                degree = Math.toDegrees(radian);
                degree = 360+ degree;                   
            }
            else
            {               
                degree = Math.toDegrees(radian);
                degree = 180 + degree;          
            }           

            if(degree>=startAngle)
            {               
                if(degree<=(startAngle+SweepAngle))
                {                   
                    return true;
                }               
            }           
        }       
        else
        {
            return false;
        }       
        return false;
    }

    private void makeAllFalse()
    {
        for(int i=0;i<arcTouched.length;i++)
        {
            arcTouched[i] = false;
        }
    }

}
公共类SmallCircleView扩展视图{
私人涂料小环芯;
专用漆线芯;
私人涂料公司;
私人绘画;
私人画笔;
私家车;
私人油漆弧触背;
私人油漆;
私有int首字母,中间首字母;
私人国际终局;
私家车;
私有整数i=0;
私人国际中心;
int[]colors=新的int[]{0xFF33B5E5,
0xFFAA66CC,
0xFF99CC00,
0xFFFFBB33,
0xFF4444,
0xFF0099CC,
0xFFAA66CC,
0xFF669900,
0xFFFF8800,
0xFFCC0000};
private RectF oval=new RectF();
private RectF middleOval=new RectF();
private RectF finalOVal=new RectF();
私人语境;
私有int-px,py;
私有布尔值isClicked=true;
私有布尔[]arcTouched=新布尔[]{false,false,false,false};
浮雕滤镜浮雕;
压花maskfilter for big;
私有ArrayList位图=新建ArrayList();
公共SmallCircleView(上下文){
超级(上下文);
this.context=上下文;
initSmallCircle();
//TODO自动生成的构造函数存根
}
公共SmallCircleView(上下文、属性集属性)
{
超级(上下文,属性);
this.context=上下文;
initSmallCircle();
}
公共SmallCircleView(上下文上下文、属性集属性、int-defaultStyle)
{
super(上下文、属性、默认样式);
this.context=上下文;
initSmallCircle();
}
私有空间(smallcircle)()
{
设置聚焦(真);
smallCircleCore=新油漆(油漆.防油漆别名标志);
lineCore=新油漆(油漆.防油漆别名标志);
bigArc=新油漆(油漆。防油漆别名标志);
铅笔=新油漆(油漆。防漆标记);
lineCore.setColor(0xFFFFFFFF);
lineCore.setStyle(油漆、样式、填充);
线芯。设置行程宽度(4);
//大圆心。设定行程宽度(5);
smallCircleCore.setStyle(油漆、样式、填充);
setColor(0xFFFFFFFF);
设置颜色(0xFF4242);
bigArc.setStyle(油漆、样式、填充);
bigArcDraw=新油漆(小圆心);
bigArcDraw.设置行程宽度(4);
bigArcDraw.setColor(0xFF000000);
铅笔。设定行程宽度(0.5f);
铅笔。设置颜色(0x804444);
铅笔.笔画(画画.笔画.笔画);
中间圆环体=新油漆(bigArc);
中间圆环体。设置颜色(0xFFE6E6);
arcTouchedBack=新油漆(油漆.防油漆别名标志);
设置颜色(0xFF81DAF5);
arcTouchedBack.setStyle(绘制、样式、填充);
circlePaint=新油漆(油漆。防油漆别名标志);
画圈。设置样式(画图。样式。笔划);
循环喷漆设定行程宽度(10);
float[]direction=新的float[]{1,1,1};
浮子灯=0.4f;
浮点数=6;
浮动模糊=3.5f;
浮雕=新浮雕遮罩过滤器(方向、灯光、光谱、模糊);
forBig=新的浮雕遮罩过滤器(方向,1f,4,2.5f);
bitmap.clear();
add(BitmapFactory.decodeResource(getResources(),R.drawable.tasks));
add(BitmapFactory.decodeResource(getResources(),R.drawable.file_manager));
add(BitmapFactory.decodeResource(getResources(),R.drawable.home));
add(BitmapFactory.decodeResource(getResources(),R.drawable.contacts));
add(BitmapFactory.decodeResource(getResources(),R.drawable.rementer));
中环体。设置maskfilter(forBig);
设置maskfilter(forBig);
字符串log=“”;
Log.d(Log,“px&py的值”+getMeasuredWidth()+“”+getMeasuredHeight());
}
测量时的保护空隙(内部宽度测量等级、内部高度测量等级)
{
int MEASUREDWITH=测量值(widthMeasureSpec);
int measuredHeight=测量值(heightMeasureSpec);
int d=数学最小值(测量宽度、测量高度);
设定测量尺寸(d,d);
}
私有整数度量(整数度量)
{
int结果=0;
int specMode=MeasureSpec.getMode(MeasureSpec);
int specSize=MeasureSpec.getSize(MeasureSpec);
if(specMode==MeasureSpec.UNSPECIFIED)
{
结果=200;
}
其他的
{
结果=规格尺寸;
}
返回结果;
}
@凌驾
受保护的void onDraw(画布){
//TODO自动生成的方法存根
px=getMeasuredWidth()/2;
py=getMeasuredHeight();
初始值=144;
最终语言=252;
中心环率=30;
中环龙=140;
国际泳联国际泳联;
初始值=160;
fina=360;
最终设定(px-middleCircleRadius-4,py-middleCircleRadius-4,px+middleCircleRadius+4,py+middleCircleRadius+4);
middleOval.set(px middleCircleRadius,py middleCircleRadius,px+middleCircleRadius,py+middleCircleRadius);
while(init=colors.length)
{
i=0;
}
初始值=初始值+10;
}
//设置遮罩过滤器
帆布。drawArc(middleOval,180,180,假,铅笔);
中部初始值=180;
i=0;
//创建第一条弧
如果(arcTouched[0])
{
画布.拉弧(中间椭圆形,中间初始,36,真,弧背);
画布.抽弧(中间椭圆形,中间初始,36,真,铅笔);
}
其他的
{
画布.抽弧(中间椭圆形,中间初始,36,真,中间圆形体);
帆布。drawArc(中间椭圆形,