❶ androidstudio怎么实现app评分兴县
在XML中
<com.hedgehog.ratingbar.RatingBar
android:layout_marginTop="50dp"
android:layout_gravity="center"
android:id="@+id/ratingbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
hedgehog:starCount="5"
hedgehog:clickable="true"
hedgehog:starEmpty="@mipmap/ic_star_empty"
hedgehog:starFill="@mipmap/ic_star_fill"
hedgehog:starImageSize="30dp"
/>
❷ 如何评价 Android M
先吐个槽吧。
从 M 的发布来看,Google 提供的服务是分等级的:
主要公民:加州湾区人(免提Android支付)公民:美国人民(Android支付,智能家居)两个公民:印度和欧洲人(早一点,享受本金和一流的服务,超过三个公民离线地图搜索导航,Android汽车,HBO)和其他三个公民:世界各地的人们(无限的照片备份,谷歌现在利用的发展,更友好的游戏市场,新的GCM,新功能,新功能的Android穿,谷歌Chrome应用程序索引):你们谷歌不太好,嗯,玩AOSP(权限管理、手机没有深度睡眠)你想打纸板,因为这个东西便宜吗?记得root哦,记得安装谷歌Play Service哦,记得24小时带一个梯子哦,记得市场解锁哦,记得给国外信用卡哦。而指纹,指纹要做,而不是付钱,不能用铬输入密码,想玩就玩玩吧,反正在 AOSP 里,喏,拿去。
中间中国出现了好多次…… 每次都觉得,“卧槽下一秒就要说 Google Play 入华了!”,然后妥妥打脸,某十三亿人仍然被排除在“everyone in the world”之外。
❸ Android7.0还卡么怎么评价7.0Android升级有意义么
我想问问楼主多久没用过Android系统了?Android6.0已经很流畅了,Android现在真正卡的不是系统是国内软件优化不到位,Android7.0就目前流畅度并没有比Android6.0高多少(上面已经说了Android6.0很流畅了),我体验的是原生Android7.0,Android7.0什么让人印象最深刻那就是安装软件速度,一个快 真的很快其它的都是一些细节和人性化的优化
❹ 如何评价 Android M
全新的Android M相比目前的Android Lollipop(5.0)有六项重大的改进:
1.App Permissions(软件权限管理):在Android M里,应用许可提示可以自定义了。
2.Chrome Custom Tabs(网页体验提升):新版的M对于Chrome的网页浏览体验进行了提升,它对登陆网站、存储密码、自动补全资料、多线程浏览网页的安全性进行了一些列的优化。
3.App Links(APP关联):Android M加强了软件间的关联。
4.Android Pay(安卓支付):Android支付统一标准。
5.Fingerprint Support(指纹支持):Android M增加了对指纹的识别API。
6.Power & Charge(电量管理 ):新的电源管理模块将更为智能,比如Android平板长时间不移动时,M系统将自动关闭一些App。同时Android M设备将支持USB Type-C接口,新的电源管理将更好的支持Type-C接口。[1]
一. 界面结构的变化
由于去年Android 5.0采用了全新的材料设计,所以Android M在界面风格上的变化不多。不过,谷歌在这一版中也加入了一些全新设计,希望操作变得更加直观易懂。
首先在锁屏界面,你可以看到左侧新增了一个语音命令按键,由于Google
Now在Android
M中得到了更深层次的植入,所以这个部分是很容易理解的。其次,主菜单界面几乎是全新的,不再采用左右滑动翻页设计,而是变为垂直的单一列表,毕竟单手操
作时上下滑动要比左右滑动更轻松一些。另外,顶部依次为搜索栏、收藏夹栏,后者暂时不支持定制,有望在正式版中实现。
在设置在,新增了一个“Google”选项,用户可以在其中设置谷歌应用的主屏、广告喜好、地点、搜索等选项,另外还拥有一个“设置附近的设备”,媒体猜测是通过蓝牙连接其他手机、进行设置的功能,但目前测试版无法正常使用。
最后,谷歌终于细化了Android的音量选项,分为铃声、媒体及闹钟,可通过下拉菜单方便地调节,改善了此前令人混淆的音量调节逻辑。
二. 应用程序权限细化
这个新功能或多或少地借鉴了iOS,通过一个垂直的多项目界面,更直观地展示应用程序权限情况。你可以在日历、相机、联系人、地点、麦克风、电话项目中查看拥有该项目权限的应用,并进行控制。
三. Now on Tap
Now
on Tap是Android M中一个最有趣的功能,集成在Google
Now中,支持文本识别,可实现更先进的上下文体验。举个简单例子,比如有人给你发信息邀请你看电影,信息中包含电影院名称或地点,此时只要双击Home
键,便可弹出影院的位置信息,包括评价、地图等等;如果你在Instagram上看到一张图片,也可双击Home键,谷歌会自行搜索其图片和相关信息,非
常智能。
不过,笔者的问题是:如果收到同时具有电影和影院地点信息的消息,那么Now on Tap会如何区别优先级来识别?外媒的试用中并未提到这一点,所以还有待日后正式版推出时进行测试。
四. 新增休眠模式
按住设备的电源键,会发现Android M新增了一个休眠模式,这是其改善电池寿命的新方法。使用休眠模式,硬件的功耗会比普通锁屏状态下更低,从而实现更长的电池寿命。在此期间,设备依然会收到通知信息,只是用户必须关闭休眠模式才能访问。
五. Android Pay及本地指纹扫描支持
谷歌也在Android M中加入了移动支付和本地指纹扫描支持,基本上与苹果iOS的概念相同。前者将首先支持美国本土的零售品牌,如麦当劳、梅西百货等等,后者则是支付的一部分,指纹信息仅存储在本地,更加安全。由于测试机型是Nexus 6,所以无法测试Android M的指纹和支付功能,但从概念上来看,要比此前的谷歌钱包更简单易用。
六. 多窗口功能?
Reddit论坛的用户上传了一张Android M的多窗口功能截图,这是谷歌没有在大会上提到的,目前也不存在于Android M预览版中。预计谷歌会在日后加入该功能,提升超大屏手机、平板电脑的效率。事实上,三星、LG等厂商的OEM Android版本早已支持类似功能,所以Android M支持多窗口功能也并不奇怪。
总结
从
目前的预览版来看,Android M虽然没有5.0那么翻天覆地的变化,但整体方向是正确的,尤其是Now on
Tap上下文功能,极大地提升了谷歌应用的重要性和使用价值,另外电池寿命、操作性的提升也是循序渐进的。当然,移动支付和指纹识别似乎是从苹果那里借鉴
来的概念,但无疑符合用户需求,完善了自身不足。
总得来说,Android
M是更加完善的移动平台,现在只剩下一个问题:你的Android手机何时才能获得升级固件呢?显然,Android升级不像iOS那么简单,涉及到手机
厂商、移动运营商等多重障碍,所以希望谷歌在提升Android自身素质的同时,也应该考虑一下如何解决升级难的问题。
❺ 如何对Android手机 进行 多媒体性能测试 呢
所谓的多媒体就是指图片,声音和视频对么?
买手机前准备几张颜色比较鲜艳,分辩率比较高的图片,放在手机上看效果,注意看手机屏幕显示的色块多不多,色块太多的话证明屏幕的可显示颜色较低.再就是分辩率,现在的手机都会给出很具体的参数,其实直接看参数就可以了,不用这么纠结的.如果还是不放心的话,检查手机时就把仔细地检查屏幕,看显示的颗粒感强不强,一般400*800以上的分辩率肉眼已经很难看出颗粒感了.
检查声音的道理跟上面差不多,准备一两首音质比较高的mp3或者其他格式的音频,在手机上播放,包括耳机和外放.
视频也如上,不再码字.
如果信不过自己的眼睛的话还可以用Aurora Softworks和Quadrant这两个软件进行直观的测试.跑完后直接看分数就OK了
❻ android 如何实现 边录音 同时显示 歌词评分有原理,代码就好了。。
歌曲播放时歌词同步显示,我们需要读取以上歌词文件的每一行转换成成一个个歌词实体,可根据当前播放器的播放进度与每句歌词的开始时间,得到当前屏幕中央高亮显示的那句歌词
我们需要读取以上歌词文件的每一行转换成成一个个歌词实体:
代码如下:
public class LyricObject {
public int begintime; // 开始时间
public int endtime; // 结束时间
public int timeline; // 单句歌词用时
public String lrc; // 单句歌词
}
可根据当前播放器的播放进度与每句歌词的开始时间,得到当前屏幕中央高亮显示的那句歌词。在UI线程中另起线程,通过回调函数 onDraw() 每隔100ms重新绘制屏幕,实现歌词平滑滚动的动画效果。MainActivity代码如下:
代码如下:
import java.io.IOException;
import android.app.Activity;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
private LyricView lyricView;
private MediaPlayer mediaPlayer;
private Button button;
private SeekBar seekBar;
private String mp3Path;
private int INTERVAL=45;//歌词每行的间隔
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// this.requestWindowFeature(Window.FEATURE_NO_TITLE);
// getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
mp3Path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/LyricSync/1.mp3";
lyricView = (LyricView) findViewById(R.id.mylrc);
mediaPlayer = new MediaPlayer();
// this.requestWindowFeature(Window.FEATURE_NO_TITLE);
ResetMusic(mp3Path);
SerchLrc();
lyricView.SetTextSize();
button = (Button) findViewById(R.id.button);
button.setText("播放");
seekBar = (SeekBar) findViewById(R.id.seekbarmusic);
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
if (fromUser) {
mediaPlayer.seekTo(progress);
lyricView.setOffsetY(220 - lyricView.SelectIndex(progress)
* (lyricView.getSIZEWORD() + INTERVAL-1));
}
}
});
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (mediaPlayer.isPlaying()) {
button.setText("播放");
mediaPlayer.pause();
} else {
button.setText("暂停");
mediaPlayer.start();
lyricView.setOffsetY(220 - lyricView.SelectIndex(mediaPlayer.getCurrentPosition())
* (lyricView.getSIZEWORD() + INTERVAL-1));
}
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
ResetMusic(mp3Path);
lyricView.SetTextSize();
lyricView.setOffsetY(200);
mediaPlayer.start();
}
});
seekBar.setMax(mediaPlayer.getDuration());
new Thread(new runable()).start();
}
public void SerchLrc() {
String lrc = mp3Path;
lrc = lrc.substring(0, lrc.length() - 4).trim() + ".lrc".trim();
LyricView.read(lrc);
lyricView.SetTextSize();
lyricView.setOffsetY(350);
}
public void ResetMusic(String path) {
mediaPlayer.reset();
try {
mediaPlayer.setDataSource(mp3Path);
mediaPlayer.prepare();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class runable implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(100);
if (mediaPlayer.isPlaying()) {
lyricView.setOffsetY(lyricView.getOffsetY() - lyricView.SpeedLrc());
lyricView.SelectIndex(mediaPlayer.getCurrentPosition());
seekBar.setProgress(mediaPlayer.getCurrentPosition());
mHandler.post(mUpdateResults);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Handler mHandler = new Handler();
Runnable mUpdateResults = new Runnable() {
public void run() {
lyricView.invalidate(); // 更新视图
}
};
}
❼ 《第一行代码:Android(第2版)Android》epub下载在线阅读,求百度网盘云资源
《第一行代码:Android(第2版)》(郭霖)电子书网盘下载免费在线阅读
链接:https://pan..com/s/1avd0IkGburAbRxMJwPXLcQ
书名:第一行代码:Android(第2版)
作者:郭霖
豆瓣评分:8.6
出版社:人民邮电出版社
出版年份:2016-12-1
页数:570
内容简介:
本书被广大Android 开发者誉为“Android 学习第一书”。全书系统全面、循序渐进地介绍了Android软件开发的必备知识、经验和技巧。
第2版基于Android 7.0 对第1 版进行了全面更新,将所有知识点都在最新的Android 系统上进行重新适配,使用 全新的Android Studio 开发工具代替之前的Eclipse,并添加了对Material Design、运行时权限、Gradle、RecyclerView、百分比布局、OkHttp、Lambda 表达式等全新知识点的详细讲解。
本书内容通俗易懂,由浅入深,既是Android 初学者的入门必备,也是Android 开发者的进阶首选。
作者简介:
郭霖
Android软件开发工程师。从事Android开发工作6年,有着丰富的项目实战经验,负责及参与开发过多款移动应用与游戏,对Android系统架构及应用层开发有着深入的理解。
2013年3月开始,在CSDN上发表Android技术相关博文,很快获得了大量网友的好评。目前博客访问量已超过500万次,评论超过10000条。荣获CSDN认证专家,并被连续评选为CSDN 2013、2014、2015年度博客之星。
❽ android+怎样进行岗位评价
怎么说呢?300是一个很尴尬的数字,如果加多100-200左右可以买到好很多,可以说好上两个档次的mp4,例如蓝魔T13HD(目前550左右),如果硬要这个价格范围,我会推荐:\r\n 艾诺V6000HDV :5英寸的,玩过很多次,不错,不过外观一般般(因为现在国内的mp4外观都是一个模似的,国外的想三星,艾利和这些外观一流的厂家不可能买到300,400这样的低价)\r\n 蓝魔T8,我向很多人推荐这款,反映都不错,具体参数自己网络,现在是400左右的。\r\n 不过,本人有一台蓝魔RM970(不是触屏的),3英寸屏幕,用来看电子书的,现在市场价大概是250左右,LZ可以考虑考虑。\r\n\r\n 真的比较符合LZ的要求的,我想是台电C430,4.3英寸屏幕,采用\“触摸+按键\”双操作方式,支持720P视频解码,售价299元(注意如果商家300不卖的话,那铁定是奸商),我想C430是最符合LZ的,而且台电是国内的一线品牌,保修方面比较好,不想纽曼啊,索尼啊都不知道去哪里保修,那真的很杯具。\r\n\r\n 300左右的价位我建议你买mp3比较好,mp4感觉很一般,本人的蓝魔RM970和台电C430还是感觉比较好,不过我想你可能不太喜欢。嘻嘻~~~~自己考虑吧 ,我都打到手酸了。\r\n\r\n 我还以为你不会买500价位,所以我就回答得比较简单,其实在500价位现在蓝魔T13HD真的不错,缺点是续航时间,由于屏幕大,而且是金属架构,所以发热有点大。至于优点我就不说太多了,网上一大堆。\r\n 在500价位现在有一款新机子蓝魔T11PRO,常非常非常棒,现在的官方报价是499元,我在电脑城看到的报价是539左右。支持1080P全高清播放与全格式兼容Android+FullHD1080P双模系统运行、HDMI高清视频输出,Android系统更多的是作为功能与软件扩展上的延伸,使这款机子的可玩性大大增强,完了几款软件,很好,本人也有点想进货玩玩,确实不错。\r\n 当然,如果你对蓝魔T13不是很满意的话,我想在500价位歌美S6000(市场价499)也是一个不错的选择,S6000作为歌美今年的一块中低价位的主推产品,在许多方面做得非常不错,很多人看中S6000就是由于它支持PDF格式的文件,但S6000的其他方面做得也是一点都不差,支持全格式,免转换,UI界面出色,值得LZ关注关注\r\n\r\n 因为蓝魔T11PRO出了不久,我的个人建议是不急于一时,等1个星期后,观望一下大家对蓝魔T11PRO的评价再做决定。玩过一次,本人对蓝魔T11PRO持肯定态度。
❾ 腾讯视频Android客户端怎么评分
在手机上给腾讯视频评分的方法如下:
1.打开手机,在手机桌面点击进入app store。
❿ android 五星打分控件星星大小怎么控制
由于Android自身的星星评分控件样式可以改,但是他的大小不好调整的缺点,只能用small normal这样的style调整,自定义不强,因此击发了我自定义星星控件的欲望。
星星评分控件的设计,大体规划为:
需要两张图片,一颗亮星星,一颗空星星;(当然图片不一定是星星,其他图片也可以,现在实验就用星星就好了)星星数量,间距可以自定义,星星的最小步进为0.1,在用户使用的时候与Android自带的方法一样。
星星控件大体分为两层,第一层空星星,第二层亮星星,第一层固定,第二层动态绘制,这样就可以实现评分。
在画星星的时候,由于在xml得出回来的对象是drawable,不必再转换为bitmap绘制,故直接绘制drawable,并且提升效率。
绘制drawable需要两个方法就够了
1、设置绘制到那里:
setBounds(int left ,int top , int right ,int bottom);
2、绘制:
draw(Canvas canvas);
设置错误setBounds会导致绘制变形:
把setbounds设置好后就一切正常:
经过一个for循环,五颗空星星就出来了,哈哈
for (int i = 0;i < starCount;i++) {
starEmptyDrawable.setBounds(starSize * i, 0, starSize * (i + 1), starSize);
starEmptyDrawable.draw(canvas);
}
for (int i = 0;i < starCount;i++) {
starEmptyDrawable.setBounds(starSize * i, 0, starSize * (i + 1), starSize);
starEmptyDrawable.draw(canvas);
}
for (int i = 0;i < starCount -1;i++) {
starFillDrawable.setBounds(starSize * i, 0, starSize * (i + 1), starSize);
starFillDrawable.draw(canvas);
}
上面几行代码成功强行装成了一个评了4分的
现在,显示几颗几颗的星星无压力,但是我们目标是需要步进为0.1的星星。
But
经过一系列的实验,发现Drawable对象没有能指定绘制需要的部分,也就是不能绘制半颗星星(反正找不到,找到可以评论告诉我),然后就采用了折中的方法,把Drawable对象变为Bitmap这样就好办了,再利用BitmapShader,想绘制多少就绘制多上(就是实现0.1步进),下面为1/3颗的效果:
转换方法:
private Bitmap drawableToBitmap(Drawable drawable)
{
if (drawable == null)return null;
Bitmap bitmap = Bitmap.createBitmap(starSize, starSize, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, starSize, starSize);
drawable.draw(canvas);
return bitmap;
}
把Bitmap转换为画笔绘制:
paint = new Paint();
paint.setAntiAlias(true);
paint.setShader(new BitmapShader(starFillBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
在ondraw()方法绘制(三分之一个)
canvas.drawRect(0,0,starSize/3,starSize,paint);
原理就是这样,剩下就是逻辑问题了,以下为星星控件代码:
package com.dming.starbar;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/**
* Created by DMing on 2016/7/18.
*
*/
public class StarBar extends View{
private int starDistance = 0; //星星间距
private int starCount = 5; //星星个数
private int starSize; //星星高度大小,星星一般正方形,宽度等于高度
private float starMark = 0.0F; //评分星星
private Bitmap starFillBitmap; //亮星星
private Drawable starEmptyDrawable; //暗星星
private OnStarChangeListener onStarChangeListener;//监听星星变化接口
private Paint paint; //绘制星星画笔
private boolean integerMark = false;
public StarBar(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public StarBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
/**
* 初始化UI组件
*
* @param context
* @param attrs
*/
private void init(Context context, AttributeSet attrs){
setClickable(true);
TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.RatingBar);
this.starDistance = (int) mTypedArray.getDimension(R.styleable.RatingBar_starDistance, 0);
this.starSize = (int) mTypedArray.getDimension(R.styleable.RatingBar_starSize, 20);
this.starCount = mTypedArray.getInteger(R.styleable.RatingBar_starCount, 5);
this.starEmptyDrawable = mTypedArray.getDrawable(R.styleable.RatingBar_starEmpty);
this.starFillBitmap = drawableToBitmap(mTypedArray.getDrawable(R.styleable.RatingBar_starFill));
mTypedArray.recycle();
paint = new Paint();
paint.setAntiAlias(true);
paint.setShader(new BitmapShader(starFillBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
}
/**
* 设置是否需要整数评分
* @param integerMark
*/
public void setIntegerMark(boolean integerMark){
this.integerMark = integerMark;
}
/**
* 设置显示的星星的分数
*
* @param mark
*/
public void setStarMark(float mark){
if (integerMark) {
starMark = (int)Math.ceil(mark);
}else {
starMark = Math.round(mark * 10) * 1.0f / 10;
}
if (this.onStarChangeListener != null) {
this.onStarChangeListener.onStarChange(starMark); //调用监听接口
}
invalidate();
}
/**
* 获取显示星星的数目
*
* @return starMark
*/
public float getStarMark(){
return starMark;
}
/**
* 定义星星点击的监听接口
*/
public interface OnStarChangeListener {
void onStarChange(float mark);
}
/**
* 设置监听
* @param onStarChangeListener
*/
public void setOnStarChangeListener(OnStarChangeListener onStarChangeListener){
this.onStarChangeListener = onStarChangeListener;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(starSize * starCount + starDistance * (starCount - 1), starSize);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (starFillBitmap == null || starEmptyDrawable == null) {
return;
}
for (int i = 0;i < starCount;i++) {
starEmptyDrawable.setBounds((starDistance + starSize) * i, 0, (starDistance + starSize) * i + starSize, starSize);
starEmptyDrawable.draw(canvas);
}
if (starMark > 1) {
canvas.drawRect(0, 0, starSize, starSize, paint);
if(starMark-(int)(starMark) == 0) {
for (int i = 1; i < starMark; i++) {
canvas.translate(starDistance + starSize, 0);
canvas.drawRect(0, 0, starSize, starSize, paint);
}
}else {
for (int i = 1; i < starMark - 1; i++) {
canvas.translate(starDistance + starSize, 0);
canvas.drawRect(0, 0, starSize, starSize, paint);
}
canvas.translate(starDistance + starSize, 0);
canvas.drawRect(0, 0, starSize * (Math.round((starMark - (int) (starMark))*10)*1.0f/10), starSize, paint);
}
}else {
canvas.drawRect(0, 0, starSize * starMark, starSize, paint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
if (x < 0) x = 0;
if (x > getMeasuredWidth()) x = getMeasuredWidth();
switch(event.getAction()){
case MotionEvent.ACTION_DOWN: {
setStarMark(x*1.0f / (getMeasuredWidth()*1.0f/starCount));
break;
}
case MotionEvent.ACTION_MOVE: {
setStarMark(x*1.0f / (getMeasuredWidth()*1.0f/starCount));
break;
}
case MotionEvent.ACTION_UP: {
break;
}
}
invalidate();
return super.onTouchEvent(event);
}
/**
* drawable转bitmap
*
* @param drawable
* @return
*/
private Bitmap drawableToBitmap(Drawable drawable)
{
if (drawable == null)return null;
Bitmap bitmap = Bitmap.createBitmap(starSize, starSize, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, starSize, starSize);
drawable.draw(canvas);
return bitmap;
}
}
attrs的文件:
XML的使用方式: