❶ 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的使用方式: