Android 自定义SeekBar显示进度百分比,2024年最新在字节跳动我是如何当面试官的

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

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

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

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

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

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

正文

if (isEnabled()) {

if (event.getAction() == MotionEvent.ACTION_DOWN

|| event.getAction() == MotionEvent.ACTION_MOVE) {

if (numberIndicator != null

&& numberIndicator.isShowing() == false)

numberIndicator.show();

if ((event.getX() <= getWidth() && event.getX() >= 0)) {

press = true;

// calculate value

int newValue = 0;

float division = (ball.xFin - ball.xIni) / (max - min);

if (event.getX() > ball.xFin) {

newValue = max;

} else if (event.getX() < ball.xIni) {

newValue = min;

} else {

newValue = min

  • (int) ((event.getX() - ball.xIni) / division);

}

if (value != newValue) {

value = newValue;

if (onValueChangedListener != null)

onValueChangedListener.onValueChanged(newValue);

}

// move ball indicator

float x = event.getX();

x = (x < ball.xIni) ? ball.xIni : x;

x = (x > ball.xFin) ? ball.xFin : x;

ViewHelper.setX(ball, x);

ball.changeBackground();

// If slider has number indicator

if (numberIndicator != null) {

// move number indicator

numberIndicator.indicator.x = x;

numberIndicator.indicator.finalY = Utils

.getRelativeTop(this) - getHeight() / 2;

numberIndicator.indicator.finalSize = getHeight() / 2;

numberIndicator.numberIndicator.setText(“”);

}

} else {

press = false;

isLastTouch = false;

if (numberIndicator != null)

numberIndicator.dismiss();

}

} else if (event.getAction() == MotionEvent.ACTION_UP

|| event.getAction() == MotionEvent.ACTION_CANCEL) {

if (numberIndicator != null)

numberIndicator.dismiss();

isLastTouch = false;

press = false;

}

}

return true;

}

/**

  • Make a dark color to press effect

  • @return

*/

protected int makePressColor() {

int r = (this.backgroundColor >> 16) & 0xFF;

int g = (this.backgroundColor >> 8) & 0xFF;

int b = (this.backgroundColor >> 0) & 0xFF;

r = (r - 30 < 0) ? 0 : r - 30;

g = (g - 30 < 0) ? 0 : g - 30;

b = (b - 30 < 0) ? 0 : b - 30;

return Color.argb(70, r, g, b);

}

private void placeBall() {

ViewHelper.setX(ball, getHeight() / 2 - ball.getWidth() / 2);

ball.xIni = ViewHelper.getX(ball);

ball.xFin = getWidth() - getHeight() / 2 - ball.getWidth() / 2;

ball.xCen = getWidth() / 2 - ball.getWidth() / 2;

placedBall = true;

}

// GETERS & SETTERS

public OnValueChangedListener getOnValueChangedListener() {

return onValueChangedListener;

}

public void setOnValueChangedListener(

OnValueChangedListener onValueChangedListener) {

this.onValueChangedListener = onValueChangedListener;

}

public int getValue() {

return value;

}

public void setValue(final int value) {

if (placedBall == false)

post(new Runnable() {

@Override

public void run() {

setValue(value);

}

});

else {

this.value = value;

float division = (ball.xFin - ball.xIni) / max;

ViewHelper.setX(ball,

value * division + getHeight() / 2 - ball.getWidth() / 2);

ball.changeBackground();

}

}

public int getMax() {

return max;

}

public void setMax(int max) {

this.max = max;

}

public int getMin() {

return min;

}

public void setMin(int min) {

this.min = min;

}

public boolean isShowNumberIndicator() {

return showNumberIndicator;

}

public void setShowNumberIndicator(boolean showNumberIndicator) {

this.showNumberIndicator = showNumberIndicator;

numberIndicator = (showNumberIndicator) ? new NumberIndicator(

getContext()) : null;

}

@Override

public void setBackgroundColor(int color) {

backgroundColor = color;

if (isEnabled())

beforeBackground = backgroundColor;

}

boolean placedBall = false;

class Ball extends View {

float xIni, xFin, xCen;

public Ball(Context context) {

super(context);

setBackgroundResource(R.drawable.background_switch_ball_uncheck);

}

public void changeBackground() {

if (value != min) {

setBackgroundResource(R.drawable.background_checkbox);

LayerDrawable layer = (LayerDrawable) getBackground();

GradientDrawable shape = (GradientDrawable) layer

.findDrawableByLayerId(R.id.shape_bacground);

shape.setColor(backgroundColor);

} else {

setBackgroundResource(R.drawable.background_switch_ball_uncheck);

}

}

}

// Slider Number Indicator

class NumberIndicator extends Dialog {

Indicator indicator;

TextView numberIndicator;

public NumberIndicator(Context context) {

super(context, android.R.style.Theme_Translucent);

}

@Override

protected void onCreate(Bundle savedInstanceState) {

requestWindowFeature(Window.FEATURE_NO_TITLE);

super.onCreate(savedInstanceState);

setContentView(R.layout.number_indicator_spinner);

setCanceledOnTouchOutside(false);

RelativeLayout content = (RelativeLayout) this

.findViewById(R.id.number_indicator_spinner_content);

indicator = new Indicator(this.getContext());

content.addView(indicator);

numberIndicator = new TextView(getContext());

numberIndicator.setTextColor(Color.WHITE);

numberIndicator.setGravity(Gravity.CENTER);

content.addView(numberIndicator);

indicator.setLayoutParams(new RelativeLayout.LayoutParams(

RelativeLayout.LayoutParams.FILL_PARENT,

RelativeLayout.LayoutParams.FILL_PARENT));

}

@Override

public void dismiss() {

super.dismiss();

indicator.y = 0;

indicator.size = 0;

indicator.animate = true;

}

@Override

public void onBackPressed() {

}

}

class Indicator extends RelativeLayout {

// Position of number indicator

float x = 0;

float y = 0;

// Size of number indicator

float size = 0;

// Final y position after animation

float finalY = 0;

// Final size after animation

float finalSize = 0;

boolean animate = true;

boolean numberIndicatorResize = false;

public Indicator(Context context) {

super(context);

setBackgroundColor(getResources().getColor(

android.R.color.transparent));

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

if (numberIndicatorResize == false) {

LayoutParams params = (LayoutParams) numberIndicator.numberIndicator

.getLayoutParams();

params.height = (int) finalSize * 2;

params.width = (int) finalSize * 2;

numberIndicator.numberIndicator.setLayoutParams(params);

}

Paint paint = new Paint();

paint.setAntiAlias(true);

paint.setColor(backgroundColor);

if (animate) {

if (y == 0)

y = finalY + finalSize * 2;

y -= Utils.dpToPx(6, getResources());

size += Utils.dpToPx(2, getResources());

}

canvas.drawCircle(

ViewHelper.getX(ball)

  • Utils.getRelativeLeft((View) ball.getParent())

最后

感觉现在好多人都在说什么安卓快凉了,工作越来越难找了。又是说什么程序员中年危机啥的,为啥我这年近30的老农根本没有这种感觉,反倒觉得那些贩卖焦虑的都是瞎j8扯谈。当然,职业危机意识确实是要有的,但根本没到那种草木皆兵的地步好吗?

Android凉了都是弱者的借口和说辞。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

所以,最后这里放上我耗时两个月,将自己8年Android开发的知识笔记整理成的Android开发者必知必会系统学习资料笔记,上述知识点在笔记中都有详细的解读,里面还包含了腾讯、字节跳动、阿里、百度2019-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。

以上全套学习笔记面试宝典,吃透一半保你可以吊打面试官,只有自己真正强大了,有核心竞争力,你才有拒绝offer的权力,所以,奋斗吧!骚年们!千里之行,始于足下。种下一颗树最好的时间是十年前,其次,就是现在。

最后,赠与大家一句诗,共勉!

不驰于空想,不骛于虚声。不忘初心,方得始终。

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

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

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

oid开发的知识笔记整理成的Android开发者必知必会系统学习资料笔记,上述知识点在笔记中都有详细的解读,里面还包含了腾讯、字节跳动、阿里、百度2019-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。

[外链图片转存中…(img-eaRpvlMq-1713685313014)]

以上全套学习笔记面试宝典,吃透一半保你可以吊打面试官,只有自己真正强大了,有核心竞争力,你才有拒绝offer的权力,所以,奋斗吧!骚年们!千里之行,始于足下。种下一颗树最好的时间是十年前,其次,就是现在。

最后,赠与大家一句诗,共勉!

不驰于空想,不骛于虚声。不忘初心,方得始终。

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

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

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

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值