Java 在android中创建具有两层的自定义视图
我必须在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
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(中间椭圆形,