2013年12月31日星期二
2013年12月28日星期六
創建圓角的EditText
創建圓角的EditText:
首先創建/res/drawable/roundcorner.xml文件.
在佈局文件, 設置android:background="@drawable/roundcorner".
首先創建/res/drawable/roundcorner.xml文件.
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:padding="5dp" android:shape="rectangle" > <solid android:color="#B0B0B0" /> <corners android:bottomLeftRadius="10dp" android:bottomRightRadius="10dp" android:topLeftRadius="10dp" android:topRightRadius="10dp" /> </shape>
在佈局文件, 設置android:background="@drawable/roundcorner".
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <EditText android:id="@+id/editText1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10sp" android:drawablePadding="5dp" android:drawableStart="@drawable/ic_launcher" android:gravity="left|bottom" android:textColor="#F0F0F0" android:background="@drawable/roundcorner" android:hint="hello" > </EditText> </LinearLayout>
在EditText上添加圖標
在EditText上添加圖標的實例:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <EditText android:id="@+id/editText1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10sp" android:drawablePadding="5dp" android:drawableStart="@drawable/ic_launcher" android:gravity="left|bottom" android:textColor="#F0F0F0" android:background="#B0B0B0" android:hint="hello" > </EditText> </LinearLayout>
2013年12月24日星期二
Google Maps Android API Utility Library (谷歌地圖AndroidAPI工具庫)
Google Maps Android API Utility Library (谷歌地圖AndroidAPI工具庫) 是一個開放源碼的類庫, 為地圖應用程序提供先進的功能. 這是提供源代碼的 GitHub 網站.
Maps Shortcuts: Android Maps Utility Library
Maps Shortcuts: Android Maps Utility Library
2013年12月18日星期三
2013年12月10日星期二
2013年12月8日星期日
實現 GestureDetector.OnGestureListener 檢測手勢
這個示例代碼通過實現 GestureDetector.OnGestureListener 檢測用戶的手勢操作:
相關帖子:
- 手勢檢測 GestureDetector.SimpleOnGestureListener
實現 GestureDetector.OnGestureListener 檢測手勢 |
package com.example.androidgesturedetector; import android.os.Bundle; import android.app.Activity; import android.support.v4.view.GestureDetectorCompat; import android.view.GestureDetector; import android.view.MotionEvent; import android.widget.TextView; public class MainActivity extends Activity { String info; TextView infoView; private GestureDetectorCompat myGestureDetectorCompat; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.activity_main); infoView = new TextView(this); setContentView(infoView); info = ""; infoView.setText(info); myGestureDetectorCompat = new GestureDetectorCompat(this, myOnGestureListener); } @Override public boolean onTouchEvent(MotionEvent event) { myGestureDetectorCompat.onTouchEvent(event); return super.onTouchEvent(event); } GestureDetector.OnGestureListener myOnGestureListener = new GestureDetector.OnGestureListener() { @Override public boolean onDown(MotionEvent e) { info = "onDown - " + e.getX() + " : " + e.getY() + "\n"; infoView.setText(info); return false; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { info += "onFling - " + "\n" + " e1 - " + e1.getX() + " : " + e1.getY() + "\n" + " e2 - " + e2.getX() + " : " + e2.getY() + "\n" + " velocityX = " + velocityX + "\n" + " velocityY = " + velocityY + "\n"; infoView.setText(info); return false; } @Override public void onLongPress(MotionEvent e) { info += "onLongPress - " + e.getX() + " : " + e.getY() + "\n"; infoView.setText(info); } @Override public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) { info += "onScroll\n"; infoView.setText(info); return false; } @Override public void onShowPress(MotionEvent e) { info += "onShowPress - " + e.getX() + " : " + e.getY() + "\n"; infoView.setText(info); } @Override public boolean onSingleTapUp(MotionEvent e) { info += "onSingleTapUp - " + e.getX() + " : " + e.getY() + "\n"; infoView.setText(info); return false; } }; }
相關帖子:
- 手勢檢測 GestureDetector.SimpleOnGestureListener
2013年12月2日星期一
手勢檢測 GestureDetector.SimpleOnGestureListener
GestureDetector.SimpleOnGestureListener 類為檢測手勢(Gesture)提供一種簡單的方式. 它實現了 GestureDetector.OnGestureListener 和 GestureDetector.OnDoubleTapListener 的所有方法. 你只需要擴展 GestureDetector.SimpleOnGestureListener 子類,並重寫所需的方法便可以。
返回值: 如果該事件被消耗掉 return true,否則 return false.
示例代碼:
相關帖子:
- 實現 GestureDetector.OnGestureListener 檢測手勢
返回值: 如果該事件被消耗掉 return true,否則 return false.
示例代碼:
package com.example.androidsimpleongesturelistener; import android.os.Bundle; import android.support.v4.view.GestureDetectorCompat; import android.view.GestureDetector; import android.view.MotionEvent; import android.widget.TextView; import android.app.Activity; public class MainActivity extends Activity { private GestureDetectorCompat myGestureDetector; String info; TextView infoView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); infoView = new TextView(this); setContentView(infoView); info = ""; infoView.setText(info); myGestureDetector = new GestureDetectorCompat(this, new MyGestureListener()); } @Override public boolean onTouchEvent(MotionEvent event) { this.myGestureDetector.onTouchEvent(event); return super.onTouchEvent(event); } class MyGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onDoubleTap(MotionEvent e) { info += "onDoubleTap - " + e.getX() + " : " + e.getY() + "\n"; infoView.setText(info); return super.onDoubleTap(e); } @Override public boolean onDoubleTapEvent(MotionEvent e) { info += "onDoubleTapEvent - " + e.getX() + " : " + e.getY() + "\n"; infoView.setText(info); return super.onDoubleTapEvent(e); } @Override public boolean onDown(MotionEvent e) { info = "onDown - " + e.getX() + " : " + e.getY() + "\n"; infoView.setText(info); return super.onDown(e); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { info += "onFling - " + "\n" + " e1 - " + e1.getX() + " : " + e1.getY() + "\n" + " e2 - " + e2.getX() + " : " + e2.getY() + "\n" + " velocityX = " + velocityX + "\n" + " velocityY = " + velocityY + "\n"; infoView.setText(info); return super.onFling(e1, e2, velocityX, velocityY); } @Override public void onLongPress(MotionEvent e) { info += "onLongPress - " + e.getX() + " : " + e.getY() + "\n"; infoView.setText(info); super.onLongPress(e); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { /* info += "onScroll - " + "\n" + " e1 - " + e1.getX() + " : " + e1.getY() + "\n" + " e2 - " + e2.getX() + " : " + e2.getY() + "\n" + " distanceX = " + distanceX + "\n" + " distanceY = " + distanceY + "\n"; infoView.setText(info); */ info += "onScroll\n"; infoView.setText(info); return super.onScroll(e1, e2, distanceX, distanceY); } @Override public void onShowPress(MotionEvent e) { info += "onShowPress - " + e.getX() + " : " + e.getY() + "\n"; infoView.setText(info); super.onShowPress(e); } @Override public boolean onSingleTapConfirmed(MotionEvent e) { info += "onSingleTapConfirmed - " + e.getX() + " : " + e.getY() + "\n"; infoView.setText(info); return super.onSingleTapConfirmed(e); } @Override public boolean onSingleTapUp(MotionEvent e) { info += "onSingleTapUp - " + e.getX() + " : " + e.getY() + "\n"; infoView.setText(info); return super.onSingleTapUp(e); } } }
手勢檢測 GestureDetector.SimpleOnGestureListener |
相關帖子:
- 實現 GestureDetector.OnGestureListener 檢測手勢
2013年11月2日星期六
2013年10月24日星期四
2013年10月11日星期五
Density-independent Pixels (密度獨立像素)
一個教導如何針對不同Android設備, 不同分辨率的問題, 創建統一用戶界面(UI)的視頻教程.
DesignBytes: Density-independent Pixels
This introductory video explains how Android app designers can easily work across different screen pixel densities by using the density-independent pixel (abbreviated dp or dip), a virtual pixel unit that keeps things the same physical size across device. Understanding dp units is critical to a successful Android app design workflow.
DesignBytes: Density-independent Pixels
This introductory video explains how Android app designers can easily work across different screen pixel densities by using the density-independent pixel (abbreviated dp or dip), a virtual pixel unit that keeps things the same physical size across device. Understanding dp units is critical to a successful Android app design workflow.
2013年9月30日星期一
如何請求重新佈局/繪製 - requestLayout()/invalidate()
如果一個視圖(View)有一些視覺變化, 希望系統重新佈局/繪製, 可以調用函數 requestLayout() 或 invalidate().
- 調用 requestLayout() 函數將安排重新佈局.
- 調用 invalidate() 函數會調用onDraw(android.graphics.Canvas).
- 調用 requestLayout() 函數將安排重新佈局.
- 調用 invalidate() 函數會調用onDraw(android.graphics.Canvas).
2013年9月27日星期五
水平放置單選按鈕(RadioButton)
<RadioGroup android:id="@+id/radiogroup2" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <RadioButton android:id="@+id/radiobutton1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="option 1" /> <RadioButton android:id="@+id/radiobutton2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="option 2" /> </RadioGroup>
2013年9月4日星期三
2013年8月17日星期六
圖像像素化 (Image Pixelization)
本視頻演示了一些實現對圖像像素化效果((Image Pixelization))的基本位圖處理(Bitmap manipulation)技術. 以及使用AsyncTask從UI線程移至後台工作線程, 以減少UI線程的負荷.
示例代碼: http://developer.android.com/shareables/devbytes/ImagePixelization.zip
2013年8月15日星期四
2013年7月25日星期四
谷歌推出 Chromecast (HDMI 串流電視棒), 只售 $35 美元
Google 還宣布 Google Cast 開發者網站, 提供 Google Cast Developer Preview. 通過 Google Cast Developer Preview, 可以開發運行在 Android, iOS, 和 Chrome 上的 sender 應用程序, 以及運行在縮減版本的Chrome 上的 receiver 應用程序.
2013年7月24日星期三
通過 Java 設定旋轉角度 setRotation()
適用 API Level 11:
通過 Java 設定旋轉角度 |
package com.example.androidview; import android.os.Bundle; import android.app.Activity; import android.widget.ImageView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView image = (ImageView)findViewById(R.id.image); image.setRotation(270); } }
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> </RelativeLayout>
通過XML設定旋轉角度 android:rotation
例子:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ImageView android:id="@+id/image" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/ic_launcher" android:rotation="45.0" /> </RelativeLayout>
2013年7月17日星期三
比爾·蓋茨在微軟研究院教育高峰會2013開幕主題演講
Bill Gates Opening Keynote at Microsoft Research Faculty Summit 2013
微軟董事長比爾·蓋茨在微軟研究院教育高峰會2013討論計算研究如何可以改善我們的世界.
2013年7月13日星期六
2013年7月11日星期四
2013年6月28日星期五
2013年6月26日星期三
2013年6月25日星期二
2013年6月24日星期一
2013年6月19日星期三
2013年6月15日星期六
Facebook上發布的數據,包括所有國家的安全要求
Facebook上公布包括所有(美國)國家安全要求的數據: http://newsroom.fb.com/News/636/Facebook-Releases-Data-Including-All-National-Security-Requests.
谷歌又一新計劃項目: Project Loon
世界上三分之二人口還沒有上網! 谷歌的新項目 Project Loon 是一個行駛在太空邊緣的氣球網絡, 這些氣球上行駛邊緣空間,它的目的旨在連接在農村和偏遠地區的人, 幫助填補網絡覆蓋, 以及在災難發生後為人們帶來重新的聯機. http://www.google.com/loon/
2013年6月13日星期四
2013年6月9日星期日
2013年6月8日星期六
視頻: 自定義活動動畫(Custom Activity Animations)
Window Animations 是一個製作活動間過渡動畫的簡單方法. 這個視頻涵蓋可定制動畫的不同技術。
DevBytes: Custom Activity Animations
DevBytes: Custom Activity Animations
2013年6月3日星期一
2013年6月2日星期日
當Android遇上谷歌地圖 - Google I/O 2013 視頻
使用 Google Maps Android API 建立直觀和引人入勝的移動地圖應用程序. 這段視頻展示創新的方式來整合地圖和Android傳感器與Android上的谷歌服務. 探討可視化背景, 個性化和及時信息的概念.
2013年4月22日星期一
通過讀取 android.os.Build.VERSION.SDK_INT 獲得操作系統版本
通過讀取 android.os.Build.VERSION.SDK_INT 獲得操作系統版本 |
package com.example.androidbuildversion; import java.util.Arrays; import java.util.List; import android.os.Bundle; import android.app.Activity; import android.widget.TextView; public class MainActivity extends Activity { final static Integer[] VersionCode = { android.os.Build.VERSION_CODES.BASE, android.os.Build.VERSION_CODES.BASE_1_1, android.os.Build.VERSION_CODES.CUPCAKE, android.os.Build.VERSION_CODES.CUR_DEVELOPMENT, android.os.Build.VERSION_CODES.DONUT, android.os.Build.VERSION_CODES.ECLAIR, android.os.Build.VERSION_CODES.ECLAIR_0_1, android.os.Build.VERSION_CODES.ECLAIR_MR1, android.os.Build.VERSION_CODES.FROYO, android.os.Build.VERSION_CODES.GINGERBREAD, android.os.Build.VERSION_CODES.GINGERBREAD_MR1, android.os.Build.VERSION_CODES.HONEYCOMB, android.os.Build.VERSION_CODES.HONEYCOMB_MR1, android.os.Build.VERSION_CODES.HONEYCOMB_MR2, android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH, android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1, android.os.Build.VERSION_CODES.JELLY_BEAN, android.os.Build.VERSION_CODES.JELLY_BEAN_MR1 }; final static String[] Version = { "BASE - October 2008: The original, first, version of Android", "BASE_1_1 - February 2009: First Android update, officially called 1.1", "CUPCAKE - May 2009: Android 1.5", "CUR_DEVELOPMENT - Magic version number for a current development build", "DONUT - September 2009: Android 1.6", "ECLAIR - November 2009: Android 2.0", "ECLAIR_0_1 - December 2009: Android 2.0.1", "ECLAIR_MR1 - January 2010: Android 2.1", "FROYO - June 2010: Android 2.2", "GINGERBREAD - November 2010: Android 2.3", "GINGERBREAD_MR1 - February 2011: Android 2.3.3", "HONEYCOMB - February 2011: Android 3.0", "HONEYCOMB_MR1 - May 2011: Android 3.1", "HONEYCOMB_MR2 - June 2011: Android 3.2", "ICE_CREAM_SANDWICH - October 2011: Android 4.0", "ICE_CREAM_SANDWICH_MR1 - December 2011: Android 4.0.3", "JELLY_BEAN - June 2012: Android 4.1", "JELLY_BEAN_MR1 - Android 4.2: Moar jelly beans!" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); TextView textVersion = new TextView(this); setContentView(textVersion); int SDKversion = android.os.Build.VERSION.SDK_INT; int matched = Arrays.asList(VersionCode).indexOf((int)SDKversion); if(matched == -1){ textVersion.setText(String.valueOf(SDKversion) + " : " + "unknown!"); }else{ textVersion.setText(String.valueOf(SDKversion) + " : " + Version[matched]); } } }
2013年4月20日星期六
2013年4月12日星期五
runOnUiThread(), 在用戶界面線程上運行
在 Android 上, 應用程序不能在後台線程更新用戶界面. 如果你需要在後台線程更新用戶界面, 一個非常簡單的方法是
呼叫 runOnUiThread(Runnable action) 方法. action Runnable 會在稍後的UI線程上運行.
runOnUiThread(new Runnable(){ @Override public void run() { //do something on UI here } });
2013年4月11日星期四
如何檢查目前是否運行在UI線程
可以使用下面的程序碼檢查目前是否運行在UI線程:
if(Looper.getMainLooper().getThread() == Thread.currentThread()){ //目前運行在UI線程 }else{ 目前運行不是在UI線程 }
2013年3月28日星期四
开源中国, 中国最大的开源技术社区
开源中国 www.oschina.net 成立于2008年8月,是中国最大的开源技术社区。我们传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国已收录超过两万款开源软件。
经过不断的改进,目前开源中国社区已经形成了由开源软件库、代码分享、资讯、翻译、讨论区和博客等几大频道内容。
经过不断的改进,目前开源中国社区已经形成了由开源软件库、代码分享、资讯、翻译、讨论区和博客等几大频道内容。
2013年2月20日星期三
視頻 - 在平板電腦上運行的Ubuntu
Ubuntu for tablets - Full video
Ubuntu 創始人 Mark Shuttleworth 解釋 在平板電腦上運行的Ubuntu.
Ubuntu 創始人 Mark Shuttleworth 解釋 在平板電腦上運行的Ubuntu.
2013年2月6日星期三
實現自動滾動的文本視圖 - marquee
通過 marquee 實現自動滾動的文本視圖的例子:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:singleLine="true" android:scrollHorizontally="true" android:ellipsize="marquee" android:marqueeRepeatLimit ="marquee_forever" android:focusable="true" android:focusableInTouchMode="true" android:textSize="28sp" android:text="Android編程: .............滾動文字" /> </RelativeLayout>
2013年2月2日星期六
2013年1月30日星期三
2013年1月3日星期四
在Android上顯示TTF/OTF
"OTF" 是 OpenType 字體, 在大多數現代操作系統中使用.
"TTF" 是 TrueType 字體, 適用於Windows的首選.
要在Android上顯示TTF/OTF, 首先要下載和複製到/assets/fonts 文件夾. 可以在這裡找到一些免費的字體. 注意, 僅複製所需要的字體文件, 否則,很浪費內存資源, 甚至不能加載/運行!
程序代碼:
"TTF" 是 TrueType 字體, 適用於Windows的首選.
要在Android上顯示TTF/OTF, 首先要下載和複製到/assets/fonts 文件夾. 可以在這裡找到一些免費的字體. 注意, 僅複製所需要的字體文件, 否則,很浪費內存資源, 甚至不能加載/運行!
程序代碼:
package com.example.androidfonts; import android.os.Bundle; import android.app.Activity; import android.graphics.Typeface; import android.widget.TextView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView ttfView = (TextView)findViewById(R.id.ttf); TextView otfView = (TextView)findViewById(R.id.otf); Typeface ttfFace_FreeMonoBold = Typeface.createFromAsset(getAssets(), "fonts/FreeMonoBold.ttf"); Typeface otfFace_FreeSansBoldOblique = Typeface.createFromAsset(getAssets(), "fonts/FreeSansBoldOblique.otf"); ttfView.setTypeface(ttfFace_FreeMonoBold); ttfView.setTextSize(28); otfView.setTypeface(otfFace_FreeSansBoldOblique); otfView.setTextSize(28); } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <TextView android:id="@+id/ttf" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello! I'm TTF" /> <TextView android:id="@+id/otf" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello! I'm OTF" /> </LinearLayout>
訂閱:
文章 (Atom)