您的位置:首页 > 移动开发 > Android开发

Android杂谈(9)一个源码的尴尬

2016-08-24 07:28 453 查看
本菜GitHub上开源了一个小的Android项目,感兴趣的看官大大们可以star下:
https://github.com/zhiaixinyang/MyFirstApp
今天找了一个开源项目,准确说不是开源...下载这个源码交了几个积分。

项目效果是这样的


项目本身没有啥新奇之处,只是使用的时候遇到了一个好玩的地方。



attr的属性就是菜单项的图片资源。有意思的地方就在这,只设置了一次,预览却出现了三个命名类似的三个图片资源。

当时我就有点懵逼了,怎么做到的...


但是作为高举伟大爱国主义旗帜的建设全面小康社会的党的接班人。


当看到源码的时候,原来....





成员变量stone是个内部类....作者写了一个循环,按照资源名+1,2,3的规则加入了stone这个数组中,然后在onDraw上画出来.....


9月21号补充

最近在学习自定义View,所以又把这个开源项目拿出来,学习记录这里边的思路.....

首先可以看出来,主干是一个圆形虚线,相关绘画代码如下:

/**
* 这个类的作用就是将Path的线段虚线化,也就是画虚线效果。
* 第1个数组参数的效果是:
* 绘制长度5的实线,再绘制长度5的空白,再绘制长度5的实线,再绘制长度5的空白,依次重复。
* 第2个参数,1是起始位置的偏移量。
*/
PathEffect effects = new DashPathEffect(new float[]{5,5,5,5},1);
mPaint.setPathEffect(effects);


计算这三个图标就比较的复杂,大部分都是计算....

在这里就梳理一下作者的用到的一些方法。

首先是onDraw()里边的,

@Override
public void onDraw(Canvas canvas) {
//画一个白色的圆环
canvas.drawCircle(mPointX, mPointY, mRadius, mPaint);
/**
* 将每个菜单画出来
* STONE_COUNT,需要绘画的图片数
*
*/
for (int index = 0; index < STONE_COUNT; index++) {
if (!mStones[index].isVisible)
continue;
drawInCenter(canvas, mStones[index].bitmap, mStones[index].x,
mStones[index].y);
}
}



这里边提到了drawInCenter()方法。

private void drawInCenter(Canvas canvas, Bitmap bitmap, float left, float top) {
Rect dst = new Rect();
dst.left = (int) (left - menuRadius);
dst.right = (int) (left + menuRadius);
dst.top = (int) (top - menuRadius);
dst.bottom = (int) (top + menuRadius);
canvas.setDrawFilter(pfd);
canvas.drawBitmap(bitmap, null, dst, mPaint);
}

menuRadius:在onMeasure()中赋值为屏幕宽度的十分之一。

canvas.setDrawFilter(pfd):设置抗锯齿。
接下来是mStones(一个内部类,用于封装了每个按钮图片的信息)的x和y的计算赋值....
/**
* 计算某点的角度
* @param x
* @param y
* @return
*/
private int computeCurrentAngle(float x, float y) {
//Math.sqrt(),返回传入值的平方根。
float distance = (float) Math
.sqrt(((x - mPointX) * (x - mPointX) + (y - mPointY)
* (y - mPointY)));
int degree = (int) (Math.acos((x - mPointX) / distance) * 180 / Math.PI);
if (y < mPointY) {
degree = -degree;
}
return degree;
}


自定义View的初级阶段就是onDraw(),onMeasure()以及onLayout()的使用。如其名字一样,分别是绘制,测量,布局。在onDraw()中,通过Paint画笔和Canvas画布进行配合,绘制出一些简单的图形。

比如,canvas.drawCircle(cx,cy,radius,paintRed);的意思就是在cx,cy这个坐标以radius为半径,paintRed为画笔画一个圆....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐