view电动车加一组电池图解个电池小标什么作用

iOS 实时修改顶部电池条颜色
通过滑动界面,根据偏移量 实时修改顶部statusBarStyle(电池条)颜色。 直接上代码:
首先将info.plist文件中View controller-based status bar appearance这个参数设置为NO。
其次在scrollView的代理方法里设置样式即可
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
_content = scrollView.contentOffset.y;
_navview.alpha = _content / 200;
if (_navview.alpha & 0) {
return [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:NO];//黑色
return [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:NO];//白色
这里要注意如果你的上一个界面和下一个界面不需要改变电池颜色, 需要在上一个界面和下一个界面的viewWillAppear方法里 将电池条颜色置为原来的颜色。
- (void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
//设置电池条为黑色
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:NO];爱上博客,爱上博客街,爱上生活
> Android自定义View之电池容量更新
Android自定义View之电池容量更新
最近项目要实现一个动态显示电池电量的功能
1.动态显示电池电量
2.如果是充电中的话,要有动画
其中采用自定义广播来监听电池状态
private BroadcastReceiver batteryChangedReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) {
int level = intent.getIntExtra("level", 0);
int scale = intent.getIntExtra("scale", 100);
// BatteryManager.BATTERY_STATUS_CHARGING 表示是充电状态
// BatteryManager.BATTERY_STATUS_DISCHARGING 放电中
// BatteryManager.BATTERY_STATUS_NOT_CHARGING 未充电
// BatteryManager.BATTERY_STATUS_FULL 电池满
int status = intent.getIntExtra("status", 0); // 电池状态
Loger.e(TAG, "status" + status);
//BatteryManager.BATTERY_STATUS_CHARGING;
int power = level * 100 /
if (status == BatteryManager.BATTERY_STATUS_CHARGING) {
Loger.e(TAG, "充电中");
mBatteryView.setCharging(true);
mBatteryView.setPower(power);
Loger.e(TAG, "充电完成");
mBatteryView.setCharging(false);
mBatteryView.setPower(power);
自定义View
* Created by 王军 on .
* 主要实现功能,显示电量
* 如果充电中,则显示动画
* 实现思路,先将其画出来,然后考虑兼容性
public class BatteryViewSelf
extends View
private static final String TAG = "BatteryViewSelf";
private int mC
private int mStrokeC
* 电量的最大值
private int mPower = 100;
* 电池的宽度
int mBatteryWidth
* 电池的高度
int mBatteryHeight = 15;
* 电池内边距
int mBatteryInsideMargin = 0;
Paint mBorderP
Paint mBatteryP
private Paint mBatteryHeaderP
* 电池更新的时间间隔
private int mInterval
* 充电时的颜色
private int mChargingColor
= Color.GREEN;
* 低电量的颜色
private int mLowBatteryColor = Color.RED;
* 圆角距形的角度
*外部圆角距形
private RectF mBoardRF;
private float mStrokeW
int mAutoIncrementWidth = 0;
public boolean isCharging() {
return isC
public void setCharging(boolean charging) {
isCharging =
* 正在充电中
private boolean isCharging =
private boolean mLastStatus =
public BatteryViewSelf(Context context) {
this(context, null);
public BatteryViewSelf(Context context, AttributeSet attrs) {
this(context, attrs, 0);
public BatteryViewSelf(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
Loger.e(TAG, "BatteryViewSelf");
mBatteryWidth = (int) TypedValue.PLEX_UNIT_DIP,
getContext().getResources()
.getDisplayMetrics());
mBatteryHeight = (int) TypedValue.PLEX_UNIT_DIP,
getContext().getResources()
.getDisplayMetrics());
* 获得我们所定义的自定义样式属性
TypedArray a = context.getTheme()
.obtainStyledAttributes(attrs,
R.styleable.BatteryView,
defStyleAttr,
int n = a.getIndexCount();
for (int i = 0; i & i++) {
int attr = a.getIndex(i);
switch (attr) {
case R.styleable.BatteryView_bvRadius:
mRadius = a.getFloat(attr, 9f);
case R.styleable.BatteryView_bvStrokeWidth:
mStrokeWidth = a.getDimension(attr, 2);
case R.styleable.BatteryView_bvWidth:
mBatteryWidth = a.getDimensionPixelSize(attr, mBatteryWidth);
case R.styleable.BatteryView_bvHeight:
mBatteryHeight = a.getDimensionPixelSize(attr, mBatteryHeight);
case R.styleable.BatteryView_bvStrokeColor:
mStrokeColor = a.getColor(attr, Color.GREEN);
case R.styleable.BatteryView_bvColor:
mColor = a.getColor(attr, Color.GREEN);
case R.styleable.BatteryView_bvInsideMargin:
mBatteryInsideMargin = a.getDimensionPixelSize(attr, 0);
a.recycle();
Loger.e(TAG, "mStroke1" + mStrokeWidth);
void initPaint() {
//初始画笔
//外框画笔
mBorderPaint = new Paint();
mBorderPaint.setColor(mStrokeColor);
mBorderPaint.setAntiAlias(true);
mBorderPaint.setStrokeWidth(mStrokeWidth);
mBorderPaint.setStyle(Paint.Style.STROKE);
//电池画笔
mBatteryPaint = new Paint();
mBatteryPaint.setStyle(Paint.Style.FILL);
mBatteryPaint.setColor(mColor);
mBatteryPaint.setAntiAlias(true);
//电池头画笔
mBatteryHeaderPaint = new Paint();
mBatteryHeaderPaint.setStyle(Paint.Style.FILL);
mBatteryHeaderPaint.setColor(mStrokeColor);
mBatteryHeaderPaint.setAntiAlias(true);
* 中心点X坐标
float centerX;
* 中心点Y坐标
float centerY;
Rect mBatteryV
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
Loger.e(TAG, "onSizeChanged");
initPaint();
centerX = getMeasuredWidth() / 2;
centerY = getMeasuredHeight() / 2;
mBoardRF = new RectF();
mBoardRF.left = centerX - mBatteryWidth / 2;
mBoardRF.top = centerY - mBatteryHeight / 2;
mBoardRF.right = centerX + mBatteryWidth / 2;
mBoardRF.bottom = centerY + mBatteryHeight / 2;
//画电池电量
mBleft = (int) (mBoardRF.left + mBatteryInsideMargin + mStrokeWidth);
mBtop = (int) (mBoardRF.top + mBatteryInsideMargin + mStrokeWidth);
mBright = (int) (mBoardRF.right - mBatteryInsideMargin - mStrokeWidth);
mBbottom = (int) (mBoardRF.bottom - mBatteryInsideMargin - mStrokeWidth);
mBatteryVolume = new Rect();
mBatteryVolume.left = mB
mBatteryVolume.top = mB
mBatteryVolume.bottom = mB
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int sizeWidth
= MeasureSpec.getSize(widthMeasureSpec);
int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);
int modeWidth
= MeasureSpec.getMode(widthMeasureSpec);
int modeHeight = MeasureSpec.getMode(heightMeasureSpec);
if (modeWidth == MeasureSpec.AT_MOST || modeWidth == MeasureSpec.UNSPECIFIED) {
sizeWidth = (int) TypedValue.PLEX_UNIT_DIP,
mBatteryWidth,
getContext().getResources()
.getDisplayMetrics());
sizeWidth += getPaddingLeft() + getPaddingRight();
if (modeHeight == MeasureSpec.AT_MOST || modeHeight == MeasureSpec.UNSPECIFIED) {
sizeHeight = (int) TypedValue.PLEX_UNIT_DIP,
mBatteryHeight,
getContext().getResources()
.getDisplayMetrics());
sizeHeight += getPaddingBottom() + getPaddingTop();
setMeasuredDimension(sizeWidth, sizeHeight);
* 绘制电池
* @param canvas
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRoundRect(mBoardRF, mRadius, mRadius, mBorderPaint);
float power_percent = mPower / 100.0f;
//画电池电量
mBatteryVolume.right = (int) (mBatteryVolume.left + getDynamicVolume(mBatteryWidth * power_percent) - 2 * mStrokeWidth);
Loger.e(TAG, "mBatteryVolume.right" + mBatteryVolume.right);
canvas.drawRect(mBatteryVolume, mBatteryPaint);
//画电池头
canvas.drawRect(mBoardRF.right,
centerY - mBatteryHeight / 4,
mBoardRF.right + mBatteryWidth / 6,
centerY + mBatteryHeight / 4,
mBatteryHeaderPaint);
* @param mWidth
private int getDynamicVolume(float mWidth) {
if (isCharging) {
mAutoIncrementWidth += 2;
mAutoIncrementWidth = 0;
if (mAutoIncrementWidth &= (mBatteryWidth - mWidth - mStrokeWidth)) {
mAutoIncrementWidth = 0;
// Loger.e(TAG,"getDynamicVolume"+mAutoIncrementWidth+"mBright"+mBright+"mBright*power_percent"+(mBright*power_percent));
return (int) (mWidth + mAutoIncrementWidth);
void chargingPower() {
postDelayed(new Runnable() {
public void run() {
postInvalidate();
if (isCharging) { chargingPower(); }
Loger.e(TAG, "chargingPower");
}, mInterval);
public void setPower(int power) {
Loger.e(TAG, "setPower");
if (mPower & 0) {
mPower = 0;
if (isCharging) {
//增加状态控制
if (!mLastStatus) {
mLastStatus = isC
chargingPower();
Loger.e(TAG, "invalidate");
mLastStatus =
invalidate();
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
isCharging =
mLastStatus =
转载请注明: &
or分享 (0)Daydream View外媒评测汇总:别迷信 小问题可真不少
[摘要]Daydream View代表着谷歌通过一种低廉、平台化的方式进入VR领域,头显本身和资源尚有一些小问题。
正在加载...
腾讯数码讯(Bob)与索尼、HTC和Facebook不同,谷歌进入VR(虚拟现实)的方式是通过移动设备。最初是略显玩笑的纸板眼镜,现在则是Daydream,一个真正的VR平台。当然,Daydream依然是移动化的,毕竟谷歌手握着Android这个全球最普及的平台,为什么不好好利用呢?与其他Android产品一样,谷歌也推出了第一方的硬件Daydream View头显,当然后续还会有越来越多手机厂商支持Daydream平台,包括手机和头显设备。虽然移动VR并非新鲜事物,但整个市场比较混乱。诸如三星等手机厂商拥有自己的平台和硬件;而很多提供广泛硬件兼容性的头显(支持iPhone和Android),整体体验也比较糟糕。更重要的是,这些产品都缺乏真正吸引人的内容。那么,谷歌的Daydream View是否会改变这种情况呢?一起来看看外媒的评测观点汇总吧。The Verge:平台其实是一切Daydream View本质上与三星Gear VR相似,让用户通过手机及应用来体验VR内容。不过,它的舒适感是其他产品不能相比的,看似廉价的泡沫和布艺纤维材质,有效降低了机身的重量,戴在脸上也非常舒服。设计上的不足是它没有大多数VR头显具备的上部固定带,人们往往会把头带束得太紧,你需要一些时间来适应、并且找到最舒服的佩戴角度。Daydream View标配一个遥控器,但它不具备桌面级VR的先进技术,比如眼部追踪、基于相机的动作追踪等等,甚至没有Gear VR透过手机相机观察现实场景的功能。不过,遥控器显然是整个VR体验的关键,可以作为一个精确的激光指针使用,未来软件更新后还可支持挥舞手臂的自然运动,绝对是Daydream平台的亮点之一。Pixel或是Pixel XL在Daydream View上的使用体验并不相同,后者的5.5英寸屏幕更大,所以视野更宽阔一些,而Pixel的5英寸屏幕会让你感觉视野明显缩小。至于应用程序,这是谷歌的长项,测试的十几个应用中有一半来自谷歌。这些应用的开发者也很好地按照谷歌的开发要求来设计界面,避免令人眩晕的360度旋转。最令人印象深刻的则是YouTube,虚拟界面和语音搜索非常友好,内容也非常丰富。Daydream View充分显示了谷歌移动VR平台的优势,丰富的内容、资源和较严格的应用开发规则,会让移动VR越来越好玩。不过它不支持iPhone,iOS版本在目前来看也不太可能出现。福布斯:三大优点三大缺点简单来说,Daydream View的优点有三个:舒适的佩戴性、设备支持和遥控器。首先,柔软的织物绝对是一个亮点,佩戴Daydream View之后,你会感觉三星Gear VR是一个庞大的塑料怪物,另外手机安装也极为方便。虽然Daydream View看上去可能像是一只鞋子,但绝对是好鞋。目前Daydream View仅支持Pixel系列手机,但这种情况很快就会改变,未来搭载强大处理器、运行Android 7.0的中高端手机都可以支持,我们不妨给谷歌一年时间。至于遥控器,它改变了其他移动VR笨拙的操控方式,不再需要伸手去摸头显上的触摸板,应用开发商们也有了更多创造空间。Daydream View同样也有三大缺点。首先,视角感觉偏窄,90度左右并不是一个很好的标准,三星Gear VR的最新版本已经达到了100度,桌面级VR则是110度。当然,这是因为谷歌需要考虑到不同手机的兼容性。第二个缺点是目前内容尚不出彩。虽然拥有几十个应用,但最好的基本都来自谷歌,很多内容颇为鸡肋,不值得一试。不过,这种情况可能会在年底得到缓解。第三个缺点,则是“屏幕门效果”,即在使用时出现网格线。这是移动VR常见的现象,因为屏幕分辨率较低,只是Daydream View更明显一些,可能4K手机会解决这个问题。Digital Trends:手机过热现象需要改善Daydream View的设计是非常友好的,舒适透气的表面佩戴感很舒适,在长时间使用这方便,谷歌暂时领先。另外,内部的塑料填充物可以拆卸清洗,不用担心多人使用后的卫生问题。总之在评测期间,长时间使用Daydream View并没有让我们产生疲劳感。光线侧漏是移动VR通常出现的问题,Daydream View也没有幸免。主要的漏光点集中在鼻子和左右两侧,这可能取决于你的脸型,所以如果漏光较为严重,最好还是在昏暗环境使用。暂时只有Pixel手机可以使用Daydream View,但一些“Daydream Ready”手机也在不断出现,比如华为Mate 9 Pro、中兴Axon 7等,它们需要升级到Android 7.0之后才能使用。至于两款Pixel手机,自然是屏幕更大、分辨率更高的Pixel XL效果更好。一个不太好的体验是:连续使用一个小时后,手机会变得非常热,谷歌表示会有一个过热提升,但在测试中并没有出现。事实上,这限制了手机运行VR游戏的能力,也加快了电池消耗,谷歌需要从软件方面来解决这个问题。我们也注意到了遥控器,有时它会停止工作,或许是失去蓝牙连接的关系,不过整体的操作体验还是很棒的。Daydream View目前可以使用YouTube VR、街景、谷歌图片、艺术与文化、华尔街日报等应用,也有几款不错的游戏,更多应用将在12月推出,它们将是平台成功的关键。目前街景、YouTube、艺术与文化等谷歌应用的体验都非常好,值得一试。Daydream View的价格也是亮点,79美元包括遥控器,要比很多移动VR设备更便宜,不过目前仅有“石板灰”一个颜色。当然,更多的体验将来自内容,应用和游戏的价格将在10-20美元之间。总得来说,Daydream虽然称不上是革命,但拥有成为最受欢迎移动VR平台的潜力。Techno Buffalo:你应该买一个最初看到Daydream View,感觉是很愚蠢的:有谁会想把一个“羊毛袜”戴在头上?但事实上,它非常舒适,这是你应该买它的第一个理由。第二个理由,就是遥控器。谷歌提供了一个2分钟的教程来指导你怎么使用它,非常易懂,事实上它是Daydream VR体验中的关键元素,你可以使用它回到主屏、用光标定位精确内容,真的很好用。虽然不清楚它的电池寿命是多久,但可以使用micro USB轻松充电。我明白Daydream是一个新的平台,所以需要更多时间来发展。目前应用的形式包括视频播放、虚拟博物馆或是几个小游戏,与三星Gear VR的体验相似,不过谷歌的号召力毋庸置疑,包括NFL等新的合作伙伴都会很快到来,未来看各种VR体育赛事都不成问题。我很好奇谷歌是否会把邮件、Chrome等服务带入到Daydream上,虽然你不能与之互动,但这种体验可能是非常有趣的。总而言之,Daydream View是值得一试的,事实上我在评测之后就已经上网购买了一款。Wired:过度依赖谷歌内容79美元的售价是谷歌Daydream View最棒的地方,它让移动VR头显不再昂贵、复杂或是沉重,又比纸板眼镜精致很多。织物表面和软衬垫戴在脸上很舒适,并且不会留下难看的印记,你还可以拆卸内部清洗。把Pixel手机放进头显、盖上盖子,手机就可以通过NFC进行配对,但这个功能有时候不太可靠,影响了使用体验。一旦系统开始运行,你就可以使用遥控器进行操作,就像拿着一个精准的激光笔,操作整个VR主屏界面,感觉非常自然。Daydream VR界面是一个恬静的田园空间,小溪、树木、瀑布看上去非常漂亮,也很舒服。不过,更多出色的体验来自谷歌自己的应用,一些第三方应用仍需要完善,比如《Wonderglade》,自上而下的视角有时候会让你感到头痛。谷歌目前正在大力发展Daydream的合作伙伴,到年底将有超过40款应用和游戏登场。不过,谷歌明白不能仅仅依靠自己的内容,这是很明智的,毕竟Netflix、NYT VR等已经吸引了大量的用户。Trusted Reviews:移动VR的未来很多人会把Daydream View当做纸板眼镜的继承者,但实际上它是一个全新的平台。它拥有很多巨大的变化,将是三星Gear VR甚至是Oculus Rift的有力竞争者。虽然只有一个头带来调节佩戴位置,但我的头很合适(头较大),我也尝试让一些头更小的朋友佩戴,他们也感觉非常舒适。类似睡衣的柔软织物面料,让Daydream View看上去很有趣,触感也很舒服,但要小心它可能会更吸水。一个遗憾的部分是:你不能佩戴眼镜使用Daydream View,会非常紧,长时间很难受。Daydream View要比三星Gear VR更易用,打开前盖放入手机就可以了,NFC会自动配对,不需要插入接口。另外,3.5mm和USB-C接口都能过外露,你可以一边充电或是使用耳机。使用Pixel XL会有些奇怪,因为手机太大,会漏出一部分,但不用担心它会掉出来。正如预期一般,Daydream目前拥有大量谷歌应用,如YouTube视频、街景等等,我不仅使用View看了大片,还到泰姬陵转了一圈,感觉不错。我还测试了哈利•波特系列新作《神奇动物在哪里》,遥控器就是魔杖,小朋友们一定会很喜欢,并且还是免费的。Daydream View也有一些缺点,比如视野要比Gear VR略窄、手机过热及电池消耗大,但目前为止我还没有感到恶心,整体体验是很不错的。最重要的是,它非常便宜,再加上谷歌的强大资源和支持,会成为移动VR的下一个趋势。小结不难发现,国外媒体对Daydream View的整体评价偏向积极。虽然硬件上拥有一些小缺点,如不支持眼镜、NFC配对不太稳定、视野率也稍窄,但也不能忽视其舒适佩戴感、操作感出色的遥控器以及相对丰富的初始资源。更重要的是,Daydream View的价格非常便宜,79美元(约合人民币540元)是比较亲民的,同时它在未来还拥有广泛的Android手机兼容性,Android平台的资源潜力也是无限的。当然,对于国内用户来说,一些谷歌服务无法使用,让Daydream View看上去没有太多可用性。对它感兴趣的朋友不妨观望,因为华为、中兴、小米等国产厂商也将支持该平台,或许还会推出第三方头显,也许会让Daydream更加本土化。推荐:关注腾讯数码微信官号(ID:qqdigi),带你玩遍各种潮酷新品,前沿资讯、一手评测、视频搞机、趣玩直播,还有各种新奇玩儿法。2017年哪十款手机最勾魂?女生用过的震动棒怎么消毒?捷达王如何变成了大宝马?iPhone 8原型机有几款?答案都在这里。
[责任编辑:yangzhao]
还能输入140字
Copyright & 1998 - 2017 Tencent. All Rights Reserved

我要回帖

更多关于 电动车加一组备用电池 的文章

 

随机推荐