androidapidemo
① com.android.apidemo什麼意思
Google公司提供的android代碼示例。
這是命名規范,(一般)以公司域名返回來作為前綴,加上應用名稱。
android系統中,以包名區分不同應用,如果Google開發的應用命名為apidemo,
其他公司也開發了一個app叫做apidemo,那這兩個應用不能同時裝在android手機中,
雖然一家公司可以將其應用的包名改為其他的,比如apidemoxx,或者abc.apidemo,
但是這樣其他公司也有可能這樣做,這樣就會很亂,所以規范(約定)就制定出來了,
各家公司以公司域名(反過來)加應用名作為應用的包名,這樣大家都遵守規范,就不會沖突了。
說的應該不完全對,但是差不多就那個意思,主要為了包名不沖突。
② 如何使用Android調用百度地圖API
:首先到API,看你需要android開發的類型,可以選擇這4個:Android地圖SDKAndroid定位SDKAndroid導航SDKAndroid全景SDK;你看需要的是哪一個,點進去,然後會看到開發指南,第一步申請對應的key,然後API對應的demo,把lib都引進去,照著demo做,demo沒有的就查看對應組件的類參考,做一次就很容易了
③ Android開發的學習路線大概是怎樣的
java語法——Java面向對象——線程——Android布局——網路——事件——自定義——Android架構整合。會了這一些,Android工作就不是問題了。我有一位老師,講得很不錯,他做了一套視頻,發布在網路傳課上了,一個閱讀器的項目,難度較大,但是對你找工作一定有很大的幫助,可以去聽聽。
④ 如何成功運行SDL官方提供的Android平台的Demo
操作步驟:
第一步:准備SDL源代碼包;
1. 去官網下載最新版SDL2-2.0.3.tar.gz;
2. 解壓後,可以在根目錄下找到android-project目錄和README-android.txt,前者是一個一個Android工程模板,後者是關於如何使用該工程的文檔說明。
3. 調整目錄,使其成為一個可編譯的工程:
(1) 將android-project目錄剪切到與SDL2-2.0.3同級的目錄;
(2) 然後將SDL2-2.0.3目錄拷貝到android-project\jni目錄下,並重命名為SDL;
第二步:為SDL增加main函數
(1) 下載wiki.libsdl.org/Tutorials#Android.c文件;
(2) 下載之後將其放入android-project\jni\src目錄;
(3) 將main.c加入android-project\jni\src\Android.mk: 在Android.mk中默認有個YourSourceHere.c,將其替換為main.c即可;
第三步:編譯libSDL2.so和libmain.so
註:請確認NDK的bin目錄已經配置到環境變數PATH中去;
打開cmd命令窗口,進入到android-project目錄,然後執行"ndk-build"命令進行編譯。編譯成功後會在android-project根目錄下生成libs目錄,下面有各個平台的需要的這兩個so文件。
第四步:修改build target配置文件
默認的工程是使用的=android-12,必須使這個target與系統配置的一致,否則編譯會失敗. 具體的配置位於android-project/project.properties和android-project/default.properties中。由於adt-bundle-windows-x86_64-20130729.zip包對應的是android-18,因此需要將這兩個文件中的配置全部改為android-18.
第五步:導入Eclipse運行
依次選擇File->New->Android->Android Project from Existing Code,然後選擇android-project目錄將工程文件導入到Eclipse中。
然後選擇按照正常的Android工程運行即可。這個時候程序閃一下什麼都沒有,因為沒有添加資源。可下載一個bmp圖片放到android-project/assets中,這個目錄是由eclipse自動生成的。然後運行就可以看到通過SDL渲染出來的圖片了。
⑤ ApiDemo是什麼
ApiDemo,該應用程序演示了很多 API。這個示例應用程序可以作為 Android 應用程序開發的良好起點。
⑥ android中如何實現一張圖片在屏幕中隨機的移動而且移動的速度可以自己調節
android中實現一張圖片在屏幕中隨機的移動的方法為:
1、用隨機庫Random實例化對象random隨機生成速度speed,然後用圖片的x,y坐標進行x+=speed及y+=speed,speed可以在指定數的范圍內生成。
2、每次隨機x、y坐標的變化量即可。
⑦ android開發中如何實現手寫輸入的記事本
實現手寫功能的主要步驟:
1. 自定義兩個View,一個是TouchView,用於在上面畫圖,另一個是EditText,用於將手寫的字顯示在其中,並且,要將兩個自定義View通過FrameLayout幀式布局重疊在起,以實現全屏手寫的功能。
2 在TouchView中實現寫字,並截取畫布中的字以Bitmap保存。
3. 設置定時器,利用handle更新界面。
下面是實現的細節:
1. 手寫的界面設計:
如上圖所示,和上節的畫板界面一致,底部分選項菜單欄,有5個選項,分別是調整畫筆大小,畫筆顏色,撤銷,恢復,以及清空,對於這些功能,之後幾節再實現。
布局文件activity_handwrite.xml
<!--?xml version=1.0 encoding=utf-8?-->
<relativelayout android:background="@android:color/white" android:layout_height="match_parent" android:layout_width="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"><imageview android:layout_above="@+id/paintBottomMenu" android:layout_height="wrap_content" android:layout_width="match_parent" android:src="@drawable/line">
</imageview></relativelayout>
可以看出,裡面有兩個自定義view,並且通過FrameLayout重疊在一起。
先來看com.example.notes.LineEditText,這個其實和添加記事中的界面一樣,就是自定義EditText,並且在字的下面畫一條線。
LineEditText.java
public class LineEditText extends EditText {
private Rect mRect;
private Paint mPaint;
public LineEditText(Context context, AttributeSet attrs) {
// TODO Auto-generated constructor stub
super(context,attrs);
mRect = new Rect();
mPaint = new Paint();
mPaint.setColor(Color.GRAY);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//得到EditText的總行數
int lineCount = getLineCount();
Rect r = mRect;
Paint p = mPaint;
//為每一行設置格式
for(int i = 0; i < lineCount;i++){
//取得每一行的基準Y坐標,並將每一行的界限值寫到r中
int baseline = getLineBounds(i, r);
//設置每一行的文字帶下劃線
canvas.drawLine(r.left, baseline+20, r.right, baseline+20, p);
}
}
}
另一個就是com.example.notes.TouchView,實現了繪制,及定時更新界面的功能,具體看代碼
TouchView.java
public class TouchView extends View {
private Bitmap mBitmap,myBitmap;
private Canvas mCanvas;
private Path mPath;
private Paint mBitmapPaint;
private Paint mPaint;
private Handler bitmapHandler;
GetCutBitmapLocation getCutBitmapLocation;
private Timer timer;
DisplayMetrics dm;
private int w,h;
public TouchView(Context context) {
super(context);
dm = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(dm);
w = dm.widthPixels;
h = dm.heightPixels;
initPaint();
}
public TouchView(Context context, AttributeSet attrs) {
super(context,attrs);
dm = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(dm);
w = dm.widthPixels;
h = dm.heightPixels;
initPaint();
}
//設置handler
public void setHandler(Handler mBitmapHandler){
bitmapHandler = mBitmapHandler;
}
//初始化畫筆,畫布
private void initPaint(){
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setColor(0xFF00FF00);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(15);
getCutBitmapLocation = new GetCutBitmapLocation();
//畫布大小
mBitmap = Bitmap.createBitmap(w, h,
Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap); //所有mCanvas畫的東西都被保存在了mBitmap中
mCanvas.drawColor(Color.TRANSPARENT);
mPath = new Path();
mBitmapPaint = new Paint(Paint.DITHER_FLAG);
timer = new Timer(true);
}
/**
* 處理屏幕顯示
*/
Handler handler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
myBitmap = getCutBitmap(mBitmap);
Message message = new Message();
message.what=1;
Bundle bundle = new Bundle();;
bundle.putParcelable(bitmap,myBitmap);
message.setData(bundle);
bitmapHandler.sendMessage(message);
RefershBitmap();
break;
}
super.handleMessage(msg);
}
};
/**
* 發送消息給handler更新ACTIVITY
*/
TimerTask task = new TimerTask() {
public void run() {
Message message = new Message();
message.what=1;
Log.i(線程, 來了);
handler.sendMessage(message);
}
};
//切割畫布中的字並返回
public Bitmap getCutBitmap(Bitmap mBitmap){
//得到手寫字的四周位置,並向外延伸10px
float cutLeft = getCutBitmapLocation.getCutLeft() - 10;
float cutTop = getCutBitmapLocation.getCutTop() - 10;
float cutRight = getCutBitmapLocation.getCutRight() + 10;
float cutBottom = getCutBitmapLocation.getCutBottom() + 10;
cutLeft = (0 > cutLeft ? 0 : cutLeft);
cutTop = (0 > cutTop ? 0 : cutTop);
cutRight = (mBitmap.getWidth() < cutRight ? mBitmap.getWidth() : cutRight);
cutBottom = (mBitmap.getHeight() < cutBottom ? mBitmap.getHeight() : cutBottom);
//取得手寫的的高度和寬度
float cutWidth = cutRight - cutLeft;
float cutHeight = cutBottom - cutTop;
Bitmap cutBitmap = Bitmap.createBitmap(mBitmap, (int)cutLeft, (int)cutTop, (int)cutWidth, (int)cutHeight);
if (myBitmap!=null ) {
myBitmap.recycle();
myBitmap= null;
}
return cutBitmap;
}
//刷新畫布
private void RefershBitmap(){
initPaint();
invalidate();
if(task != null)
task.cancel();
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); //顯示舊的畫布
canvas.drawPath(mPath, mPaint); //畫最後的path
}
private float mX, mY;
private static final float TOUCH_TOLERANCE = 4;
//手按下時
private void touch_start(float x, float y) {
mPath.reset();//清空path
mPath.moveTo(x, y);
mX = x;
mY = y;
if(task != null)
task.cancel();//取消之前的任務
task = new TimerTask() {
@Override
public void run() {
Message message = new Message();
message.what=1;
Log.i(線程, 來了);
handler.sendMessage(message);
}
};
getCutBitmapLocation.setCutLeftAndRight(mX,mY);
}
//手移動時
private void touch_move(float x, float y) {
float dx = Math.abs(x - mX);
float dy = Math.abs(y - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
mPath.quadTo(mX, mY, x, y);
// mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);//源代碼是這樣寫的,可是我沒有弄明白,為什麼要這樣?
mX = x;
mY = y;
if(task != null)
task.cancel();//取消之前的任務
task = new TimerTask() {
@Override
public void run() {
Message message = new Message();
message.what=1;
Log.i(線程, 來了);
handler.sendMessage(message);
}
};
getCutBitmapLocation.setCutLeftAndRight(mX,mY);
}
}
//手抬起時
private void touch_up() {
//mPath.lineTo(mX, mY);
mCanvas.drawPath(mPath, mPaint);
mPath.reset();
if (timer!=null) {
if (task!=null) {
task.cancel();
task = new TimerTask() {
public void run() {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
timer.schele(task, 1000, 1000); //2200秒後發送消息給handler更新Activity
}
}else {
timer = new Timer(true);
timer.schele(task, 1000, 1000); //2200秒後發送消息給handler更新Activity
}
}
//處理界面事件
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touch_start(x, y);
invalidate(); //刷新
break;
case MotionEvent.ACTION_MOVE:
touch_move(x, y);
invalidate();
break;
case MotionEvent.ACTION_UP:
touch_up();
invalidate();
break;
}
return true;
}
}
這裡面的難點就是利用TimerTask和Handle來更新界面顯示,需要在onTouchEvent的三個事件中都要通過handle發送消息來更新顯示界面。
接下來就是在activity里通過handle來得到繪制的字,並添加在editText中。
關於配置底部菜單,以及頂部標題欄,這里不再贅述,直接如何將繪制的字得到,並添加在edittext中:
得到繪制字體的Bitmap
//處理界面
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle bundle = new Bundle();
bundle = msg.getData();
Bitmap myBitmap = bundle.getParcelable(bitmap);
InsertToEditText(myBitmap);
}
};
其中myBitmap就是取得的手寫字,保存在Bitmap中, InsertToEditText(myBitmap);是將該圖片添加在edittext中,具體如下:
?
1
private LineEditText et_handwrite;
?
1
et_handwrite = (LineEditText)findViewById(R.id.et_handwrite);
//將手寫字插入到EditText中
private void InsertToEditText(Bitmap mBitmap){
int imgWidth = mBitmap.getWidth();
int imgHeight = mBitmap.getHeight();
//縮放比例
float scaleW = (float) (80f/imgWidth);
float scaleH = (float) (100f/imgHeight);
Matrix mx = new Matrix();
//對原圖片進行縮放
mx.postScale(scaleW, scaleH);
mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, imgWidth, imgHeight, mx, true);
//將手寫的字插入到edittext中
SpannableString ss = new SpannableString(1);
ImageSpan span = new ImageSpan(mBitmap, ImageSpan.ALIGN_BOTTOM);
ss.setSpan(span, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
et_handwrite.append(ss);
}
⑧ 如何看android api demo
1. Custom Dialog
Android支持自定義窗口的風格:
1)首先在資源裡面建立style的value;
example:
drawable/filled_box.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
2)設置當前activity的屬性,兩種方式:1.在manifest文件中給指定的activity增加屬性
android:theme="@android:style/Theme.CustomDialog"。2.在程序中增加語句setTheme(R.style.Theme_CustomDialog);
PS1:如果只是將Acticity顯示為默認的Dialog, 跳過第一步,只需要在manifest文中增加屬性:android:theme="@android:style/Theme.Dialog"或者在程序中增加setTheme(android.R.style.Theme_Dialog).
PS2:其他創建Dialog的方法:創建app.Dialog類或者創建app.AlertDialog類。
Next Study:能不能在Activity已經打開以後動態修改當前Activity的風格?
在測試中發現,在onCreate()事件中增加setTheme(),必須在setContentView()之前,否則指定的Style不能生效
2.Custom Title
Android除了可以為指定的Activity設置顯示風格,此外也可以為指定的Activity設置一些特效,比如自定義Title,沒有Title的Activity或者增加一個ICON等。
有意思的一點是,這些特效並不是你想設置的時候就行設置,你需要在Activity顯示之前向系統申請要顯示的特效,這樣才能在下面的程序中為這些特效進行設置。(這樣是不是多此一舉有待研究)
為一個Activity設置自定義Title的流程:
1)為自定義的Title建立一個layout(custom_title_1.xml)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/screen"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical">
<textview android:id="@+id/left_text" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:text="Left" />
<textview android:id="@+id/right_text" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="Right" />
2)為activity設定自定義Title特效並指定Title的layout:
在onCreate()事件中增加:
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.custom_title);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_1);
這三條語句的次序不能顛倒,依次為申請特效,創建view,設置特效屬性。其中requestWindowFeature等價於getWindow().requestFeature()
3)在需要修改Title的地方,獲取left_text或者right_text進行設置即可。
Next Study:Activity的其他顯示特效
Window還有其他一些feature,比如FEATURE_CONTEXT_MENU,FEATURE_NO_TITLE,FEATURE_LEFT_ICON等,有待繼續學習研究。
1. Forwarding
這個實現很簡單,就是啟動新的Activity或者Service後,增加一個finish()語句就可以了,這個語句會主動將當前 activity從歷史stack中清除,這樣back操作就不會打開當前activity。
做這個實驗的時候,發現開發Android程序需要注意的一點小問題:增加新的activity時,不能只增加一個class,一定要記得要在manifest文件中增加該activity的描述。(這個簡單的功能,未來google應該給增加吧)
「android:name中的點」意義:首先manifest會有一個默認指定的package屬性,比如指定為"com.android.sample",如果我們增加的activity的實現也在這個package下,則android:name為實現的類名,這個類名前加不加點都沒有關系,都會自動找到該實現,比如實現為forwardtarget,則android:name寫成forwardtarget或者.forwardtarget都可以。唯一有區別的是,如果activity的實現是在默認包的子包裡面,則前面這個點就尤為重要,比如activity的實現是com.android.sample.app.forwardtarget,則android:name必須寫成.app.forwardtarget或者com.android.sample.app.forwardtarget。如果只寫app.forwardtarget,通常編輯器就會提示該類找不到,但不巧的是,你恰好有一個類是app.forwardtarget,那你只有等著運行時報錯吧。
所以建議養成習慣只要是默認package下面的類,無論是否是在子包裡面,前面都要加上一個點,現在當前實現是在默認package下。
2.Persistent
這里的持久化其實就是本地配置文件的讀寫,實現方法是通過Activity.getPreferences(int)獲取SharedPreferences對象,然後操作配置文件的讀寫,值得注意的是以下幾點:
1)Activity.getPreferences(int mode)等價於Content.getSharedPreferences(String filename,int mode),這裡面的filename就是當前class的名稱,例如在PersistentTest類中調用getPreferences(0),等價於調用getPreferences("PersistentTest", 0)。如不想用class name做文件名,可以直接調用getSharedPreferences方法,自己指定配置文件的名稱。
2)mode值的定義:
MODE_PRIVATE = 0,表示當前配置文件為私有文件,只有當前的應用可以訪問。
MODE_WORLD_READABLE = 1,表示當前配置文件可以被其他應用讀取。
MODE_WORLD_WRITEABLE = 2,表示當前配置文件可以被其他應用寫入。
如果配置文件又想被人讀又想被寫人,怎麼辦呢,呵呵,當然是MODE_WORLD_READABLE&MODE_WORLD_WRITEABLE,真的懷疑設計android的人以前是做C/C++的。
3)SharedPreferences是個很有意思的實現,讀取數據的時候,直接用get方法就可以了,可是寫數據的時候,沒用給set方法,呵呵,第一次用這個類一定會以為只能讀不能寫。如果要寫數據的話,需要用editor()方法(為什麼不是getEditor()呢?看來設計的人一定是做C/C++的)獲取SharedPreferences.Editor類,然後用這個類的put方法寫文件。為什麼要這樣做呢?好久沒有看設計模式了,不知道他採用是哪種高級模式,等以後有時間,看看它的實現再做研究吧。
4)在這個實現中,讀文件是放在onResume()中,寫文件是在onPause()中,為什麼要這么做呢,看字面意思,好像只有恢復和暫停的時候才會被執行,那程序第一次創建的時候會讀文件嗎?來讓我們看看Activity的生命周期,就會發現這么做的巧妙之處:
看到了吧,在Activity運行的前後,無論狀態怎麼轉移,onResume()和onPause()一定會被執行,與其說實現的巧妙,還不如贊一下這個生命周期的設計的巧妙,這個巧妙不是說說而已,有時間的話,看看MFC中一個windows或者dialog的生命周期,你就知道這個巧妙的含義了,我們可以省多少的事情啊!所以值得記住的是,在android中想在運行前後必須要執行的語句,就應該放在onResume()和onPause()中。
4)最後說一個對android小不爽的地方:drawable,什麼鬼東西啊!在res/drawable放一個文件,訪問的時候是drawable/name,如果在values裡面建立一個drawable的變數,訪問的時候也是drawable/name,例如在drawable目錄下放入一個red.xml文件,訪問的時候是@drawable/red,如果建立一個drawable的變數red,訪問也是@drawable/red,這完全就是兩個東西啊,雖然最新的編輯器會提示重名,但查找的時候真的很不方便啊,尤其是drawable變數,可以放在一個abc.xml中 。
這個實驗描述了Activity之間的另外一種切換方式,通常Activity的切換方式是Activity1通過startActivity切換到Activity2, Activity2再通過startActivity切換到其他的Activity,但是有的時候我們需要啟動一個新的Activity獲取用戶的輸入,然後返回到原來的Activity,比如activity是一個通訊錄列表,我們通過一個增加按鈕打開另一個activity讓用戶輸入新的聯系人,輸入後再返回通訊錄列表。
這個時候,我們可以通過startActivityForResult(Intent, int)方法啟動新的Activity,新的Activity通過setResult(int, Intent)方法返回老的Activity,這個時候會觸發老的Activity的onActivityResult(int, int, Intent)方法,我們可以在這個方法的實現中處理返回事件。
startActivityForResult(Intent, int),其中int為Request Code,也是onActivityResult的第一個參數,通常一個Activity不僅僅只觸發一個獲取事件,比如上面提到的通訊錄,可能會有一個增加聯系人的事件,也可能會有一個修改聯系人或給指定聯系人增加一個電話的事件,但我們只有一個onActivityResult方法,所以我們需要這么一個Request Code區分是哪個事件的返回,這個值是用戶自己定義的,而且完全是用戶自己進行管理,很人性化。
setResult(int, Intent),其中的int是Result Code,它表示的是返回的狀態,也是onActivityResult的第二個參數。這個參數需要特別注意一下,android為這個值提供了三個默認的常量。我們先看前兩個,RESULT_CANCELED和RESULT_OK,這個從字面上很好理解,一個是運行取消,另一個是運行成功返回,當用戶按BACK鍵時,Result Code就是RESULT_CANCELED。但我們看看他們分別對應的值,就會發現奇怪的地方,RESULT_CANCELED=0,RESULT_OK=-1!!!在其他系統中OK通常都是1,而在android,它是-1,這是為什麼呢,來讓我們看看第三個默認的常量,RESULT_FIRST_USER=1,明白了吧!android把所有大於0的數字都留給了用戶自己,多麼人性化啊!但是要注意了,如我前面所說,大部分系統都喜歡將大於0作為正確返回,小於0作為錯誤返回,所以很多人(包括我),喜歡用if(result > 0)表示返回成功,這個在android是不通行的,一定要特別注意!
此外在這個程序中,我們可以看到另外一件事情,關於TextView,如果我們要改變裡面的內容,比如增加新的欄位,需要將其設為可變長的,方法是mTextView.setText(mTextView.getText(), TextView.BufferType.EDITABLE);
修改內容的方法是通過TextView.getText()獲取Editable對象,然後Editable對象進行編輯就可以了,Editable類似於StringBuffer,編輯之後會直接反映到TextView裡面,不需要再setText();
2. SaveRestoreState
完全沒有看懂這個Demo要演示什麼效果,好像是onSaveInstanceState以及TextView的android:freezesText屬性有關,但具體效果沒有研究出來,留到以後再研究吧
3.Translucent
Android為透明效果提供了內置的Theme: android:style/Theme.Translucent,只需要把當前的activity的theme設置為這個Theme就可以達到完全透明的效果。
如果要半透明的話,可以增加一個繼承該Theme的style即可,實現如下:
#e0000000
此外API Demo中提供了另一個實例,不用繼承內置的Theme,可以自己完全創建一個新的style,實現透明效果,同時可以加一些其他特效,比如模糊化等,
⑨ android apidemo在哪
apidemo文件存放位置是在sdk路徑下面,具體如下:
首先,導入API Demos。File->new->project->Android project->Creat project from existing source 選擇API Demos.
導入的文件可以在sdk的文件裡面找到,如XXX/android-8/samples.也可以直接下載如http://dl-ssl.google.com/android/repository/samples-2.2_r01-linux.zip
⑩ android studio怎麼導入api demo工程
根據官方的介紹,Android Studio可以兼容Eclipse的現有工程,但需要做一些操作: 首先升級ADT到最新版本,目前為版本號為22(注意和ADT相關的組件最好一並升級,避免後期可能出現的錯誤) 選擇需要從Eclipse導出的工程,右鍵選擇Export並選擇Andro...