Android記憶體控制小技巧-使用向量圖來節省你的記憶體並簡化你的開發。

希爾瓦娜斯女神發表於2015-07-19

先上一個 點陣圖和向量圖的 說明。http://zhidao.baidu.com/link?url=xwvs5CBzWeh15O3Ee4bICwCqg4PCQWwg5oZ0a6CVydbVZzufqrINa_TyxmVjWAKhNYi9N7vArEo2a6N-r0OJlK

維基百科裡面有更詳細的說明 我就不貼地址了。簡單來說就是點陣圖 比 向量圖要大。但是點陣圖可以適用於各種場景。

但是向量圖就只能顯示一些有規律的圖形。複雜的做不了或者是很難做。

對於android來說,我們一般app裡面 會有各種icon 的圖片。以前我們都是喜歡用imageview來表示。然後讓美工去切圖,

通常還會切好幾套,因為我們的app要適配各種不一樣dpi的裝置。這麼做的結果就是我們的drawable下面 圖片太多,

apk包打出來很大,而且imageview其實佔的記憶體也不小。最重要的是開發麻煩,我們複製圖片,美工切圖都是很累的。

 

但是使用向量圖的話,上述問題就都解決了。開發方便,佔用記憶體小。(你簡直找不到一個更好的方案來做android的icon了)

首先 網上有2個資源庫 可以供我們使用

第一個是github上的開源專案,大家可以自己去裡面找,但是這個裡面貌似沒有給你表明向量圖的key,你需要另外下載軟體來獲取

對應圖示的key 不然無法在程式碼中使用。

https://github.com/FortAwesome/Font-Awesome

 

第二個就是阿里巴巴的相簿,選取你喜歡的圖示放進購物車,然後下載就可以了。

http://www.iconfont.cn/

下載完畢以後 是這樣的。

 

那個ttf 檔案就是我們要存放在android assets目錄下的檔案。

而那個html檔案裡面 則有圖示和對應的key的值。

類似於這種:

 

注意key的值裡面 分號不能少了。

最後看下程式碼 實際上非常簡單 就是三步:

1.把ttf檔案放進assets下。

2.在程式碼裡 讓textview set typeface(這個typeface會引用你的assets下的ttf檔案)

3.在xml裡寫入圖示對應的key值 即可。

4.要注意的就是icon的大小就是由textview的sp來控制的。這一點可能和imageview 我們使用的wrapcontent有所不同。

 1 package com.example.wuyue.iconfonttest;
 2 
 3 import android.graphics.Typeface;
 4 import android.support.v7.app.ActionBarActivity;
 5 import android.os.Bundle;
 6 import android.util.Log;
 7 import android.view.Menu;
 8 import android.view.MenuItem;
 9 import android.widget.TextView;
10 
11 
12 public class MainActivity extends ActionBarActivity {
13 
14     private TextView iconFontTv;
15 
16     @Override
17     protected void onCreate(Bundle savedInstanceState) {
18         super.onCreate(savedInstanceState);
19         setContentView(R.layout.activity_main);
20         //設定tpyeface的程式碼不要漏掉
21         Typeface typeface = Typeface.createFromAsset(getAssets(), "iconfont.ttf");
22         iconFontTv = (TextView) this.findViewById(R.id.tv);
23         iconFontTv.setTypeface(typeface);
24 
25 
26     }
27 
28     @Override
29     public boolean onCreateOptionsMenu(Menu menu) {
30         // Inflate the menu; this adds items to the action bar if it is present.
31         getMenuInflater().inflate(R.menu.menu_main, menu);
32         return true;
33     }
34 
35     @Override
36     public boolean onOptionsItemSelected(MenuItem item) {
37         // Handle action bar item clicks here. The action bar will
38         // automatically handle clicks on the Home/Up button, so long
39         // as you specify a parent activity in AndroidManifest.xml.
40         int id = item.getItemId();
41 
42         //noinspection SimplifiableIfStatement
43         if (id == R.id.action_settings) {
44             return true;
45         }
46 
47         return super.onOptionsItemSelected(item);
48     }
49 }

 

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
 3     android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
 4     android:paddingRight="@dimen/activity_horizontal_margin"
 5     android:paddingTop="@dimen/activity_vertical_margin"
 6     android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
 7 
 8    <TextView
 9        android:id="@+id/tv"
10        android:layout_width="wrap_content"
11        android:layout_height="wrap_content"
12        android:textSize="50sp"
13        android:text="&#xe629;"
14        />
15 
16 </RelativeLayout>

 

text裡 填入圖示對應的key 即可,注意不要漏掉分號。

 

最後看下效果

 

相關文章