Android中仿IOS圆盘时间选择器,头条面试算法题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

circle_Paint.setAntiAlias(true);

circle_Paint.setColor(bottom_color);

circle_Paint.setStyle(Paint.Style.STROKE);

circle_Paint.setStrokeWidth(ring_width);

/*

选中区域的画笔

*/

select_Paint=new Paint(Paint.ANTI_ALIAS_FLAG);

select_Paint.setShader(new SweepGradient(0, 0, arrColorCircle, null));

/select_Paint.setColor(circle_color);/

select_Paint.setAntiAlias(true);

select_Paint.setStyle(Paint.Style.STROKE);

select_Paint.setStrokeWidth(ring_width);

// 画锚点

dot1 = new Paint(Paint.ANTI_ALIAS_FLAG);

dot1.setColor(circle_color);

dot1.setAntiAlias(true);

dot1.setStyle(Paint.Style.FILL);

// 画锚点2

dot2 = new Paint(Paint.ANTI_ALIAS_FLAG);

dot2.setColor(slide_color);

dot2.setAntiAlias(true);

dot2.setStyle(Paint.Style.FILL);

}

//获取宽度

private float getDimen(int dimenId) {

return getResources().getDimension(dimenId);

}

//获取颜色

@TargetApi(Build.VERSION_CODES.M)

private int getColor(int colorId) {

final int version = Build.VERSION.SDK_INT;

if (version >= 23) {

return getContext().getColor(colorId);

} else {

return ContextCompat.getColor(getContext(), colorId);

}

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.setalarm_colock_bg);

int height = bitmap.getHeight()+main_width*2;

int width = bitmap.getWidth()+main_width*2;

int min = Math.min(height, width);

setMeasuredDimension(min,min);

initposition();

}

private void initposition(){

//转换为360度

cur_Angle=(double) cur_progress / max_progress*360.0;

cur_Angle2=(double)cur_progress2 / max_progress*360.0;

//计算初始化旋转的角度

double cos = -Math.cos(Math.toRadians(cur_Angle));

double cos2 = -Math.cos(Math.toRadians(cur_Angle2));

//根据旋转的角度来确定位置

MakeCurPosition(cos);

MakeCurPosition2(cos2);

//确定圆环的半径

ring_Radius=(getMeasuredWidth() - getPaddingLeft() - getPaddingRight() - ring_width) / 2;

}

private void MakeCurPosition(double cos){

//根据旋转的角度来确定圆的位置

//确定x点的坐标

mWheelCurX = calcXLocationInWheel(cur_Angle, cos);

//确定y点的坐标

mWheelCurY=calcYLocationInWheel(cos);

}

private void MakeCurPosition2(double cos2){

//根据旋转的角度来确定圆的位置

//确定x点的坐标

mWheelCurX2 = calcXLocationInWheel(cur_Angle2, cos2);

//确定y点的坐标

mWheelCurY2=calcYLocationInWheel(cos2);

}

//确定x点的坐标

private float calcXLocationInWheel(double angle,double cos){

if (angle < 180) {

return (float) (getMeasuredWidth() / 2 + Math.sqrt(1 - cos * cos) * ring_Radius); //Math.sqrt正平分根 9-3

} else {

return (float) (getMeasuredWidth() / 2 - Math.sqrt(1 - cos * cos) * ring_Radius);

}

}

//确定y点的坐标

private float calcYLocationInWheel(double cos) {

return getMeasuredWidth() / 2 + ring_Radius * (float) cos;

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

float left = getPaddingLeft() + ring_width / 2;

float top = getPaddingTop() + ring_width / 2;

float right = canvas.getWidth() - getPaddingRight() - ring_width / 2;

float bottom = canvas.getHeight() - getPaddingBottom() - ring_width / 2;

float centerX = (left + right) / 2;

float centerY = (top + bottom) / 2;

float wheelRadius = (canvas.getWidth() - getPaddingLeft() - getPaddingRight()) / 2 - ring_width / 2;

canvas.drawCircle(centerX, centerY, wheelRadius, circle_Paint);

//画选中区域

// canvas.drawArc(new RectF(left, top, right, bottom), (float) (Math.PI * RADIAN + Math.acos(cur_Angle) * RADIAN), (float) (Math.abs(cur_Angle-cur_Angle2)), false, select_Paint);

Log.i(“TAG”,“第一个的角度=”+cur_Angle);

Log.i(“TAG”,“第一个的角度2=”+cur_Angle2);

float begin=0; //圆弧的起点位置

float stop=0;

if(cur_Angle>180 && cur_Angle>cur_Angle2 ){ //180 – 360

begin=(float) (-Math.abs(cur_Angle-360)-90);

stop=(float) Math.abs(Math.abs(cur_Angle-360)+cur_Angle2);

Log.i(“TAG”,“begin=”+begin);

Log.i(“TAG”,“stop=”+stop);

}else if(cur_Angle>cur_Angle2){

begin=(float) cur_Angle-90;

stop=(float)(360-(cur_Angle-cur_Angle2));

}else {

begin=(float) cur_Angle-90;

stop=(float) Math.abs(cur_Angle-cur_Angle2);

}

canvas.drawArc(new RectF(left, top, right, bottom), begin,stop, false, select_Paint);

//画锚点 画圆

canvas.drawCircle(mWheelCurX, mWheelCurY, ring_width/2, dot1);

//画锚点 画圆

canvas.drawCircle(mWheelCurX2, mWheelCurY2, ring_width/2, dot2);

Log.i(“TAG”,“锚点1Y”+mWheelCurY+“锚点1X”+mWheelCurX);

Log.i(“TAG”,“锚点2Y”+mWheelCurY2+“锚点1X”+mWheelCurX2);

}

@Override

public boolean onTouchEvent(MotionEvent event) {

float x = event.getX();

float y = event.getY();

int flag=0;

//判断是否触控到两个点中的其中某个点

if(isMovedot2(x,y)){

flag=2;

}else if(isMovedot1(x,y)){

flag=1;

}

/* if(isMovedot1(x,y)){

flag=1;

}else if(isMovedot2(x,y)){

flag=2;

}*/

if(event.getAction()==MotionEvent.ACTION_MOVE || isMovedot1(x,y) ==true || isMovedot2(x,y)==true ){

Log.i(“TAG”,“进入X=”+x+“进入Y=”+y);

//通过触摸点算出cos角度值

float cos = calculateCos(x, y);

// 通过反三角函数获得角度值

double angle; //获取滑动的角度

if (x < getWidth() / 2) { // 滑动超过180度

angle = Math.PI * RADIAN + Math.acos(cos) * RADIAN; //通过计算得到滑动的角度值

} else { // 没有超过180度

angle = Math.PI * RADIAN - Math.acos(cos) * RADIAN; //PI 周长比直径 返回弧角度的余弦值

}

if(flag==1){

cur_Angle=angle;

cur_progress=getSelectedValue(cur_Angle);

MakeCurPosition(cos);

if (changeListener != null) {

changeListener.onChanged(this, cur_progress);

}

}else if(flag==2){

cur_Angle2=angle;

cur_progress2=getSelectedValue(cur_Angle2);

MakeCurPosition2(cos);

if (changeListener2 != null) {

changeListener2.onChanged(this, cur_progress2);

}

}

invalidate();

return true;

}else {

return super.onTouchEvent(event);

}

}

private boolean isMovedot1(float x,float y){

float dot1x = Math.abs(mWheelCurX - x);

float dot1y = Math.abs(mWheelCurY - y);

if(dot1x<30 && dot1y<30){

return true;

}else{

return false;

}

}

private boolean isMovedot2(float x,float y){

float dot1x = Math.abs(mWheelCurX2 - x);

float dot1y = Math.abs(mWheelCurY2 - y);

if(dot1x<30 && dot1y<30){

return true;

}else{

return false;

}

}

//拿到切斜角的cos值

private float calculateCos(float x, float y){

float width = x - getWidth() / 2;

float height = y - getHeight() / 2;

最后

在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

**

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-G4QwieqG-1713704918776)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-Jzzo8Pj6-1713704918776)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOSAndroid测试是移动应用程序测试领域中非常重要的两个方面。在面试过程中,一些常见的问包括: 1. 你如何测试iOSAndroid应用程序? 在测试iOSAndroid应用程序时,首先要了解应用程序的功能需求和设计。然后使用相应的测试工具和设备,如Xcode和iOS模拟器进行iOS应用程序测试,使用Android Studio和模拟器进行Android应用程序测试。通过测试不同的功能和页面,包括用户界面、功能模块、设备兼容性和性能等方面,以确保应用程序的质量和稳定性。 2. 在iOSAndroid应用程序测试中,你如何处理兼容性问? 在测试兼容性时,需要考虑不同版本的iOSAndroid操作系统以及各种不同的设备。为了解决这个问,可以使用真实的设备进行测试,确保测试涵盖不同的操作系统版本和设备型号。此外,还可以利用各种移动测试工具,如Appium和Calabash等,来模拟并测试不同设备和操作系统环境下的应用程序。 3. 你在测试iOSAndroid应用程序时使用哪些自动化测试工具? 在测试iOSAndroid应用程序时,常用的自动化测试工具包括Appium、Calabash、KIF和Espresso等。这些工具可以自动化执行常见的测试任务,如界面操作、功能验证和性能测试等,并生成详细的测试报告。通过使用自动化工具,可以提高测试效率并减少测试人员的工作负担。 4. 如何测试应用程序的性能? 在测试应用程序的性能时,可以使用工具如Xcode Instruments和Android Profiler来监测应用程序的CPU、内存、网络和电池等方面的性能表现。同时,可以模拟不同的网络环境和设备压力来测试应用程序的性能稳定性。此外,还可以针对应用程序的不同功能和场景进行负载测试和压力测试,以验证其在高负载环境下的性能表现。 总而言之,测试iOSAndroid应用程序需要综合考虑功能、兼容性和性能等方面的测试,并利用相应的测试工具和设备来保证应用程序的质量和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值