- Android開發之畫圖的實現
四天前上完安卓的第一節課,真的是一臉懵逼,盡管熊哥說和java是差不多的,然而這個包和那個包之間的那些轉換都是些什么鬼呀!!!但是四天的學習和操作下來,我覺得安卓比java的學習要有趣一些,也更加簡潔一些,它不像java要寫很多類,所有的實現都在那幾個類中,java的學習就像苦行僧似的,要什么自己去白手起家吧!但是安卓的學習是不同的,它更像一個富二代,父輩把基礎都給你打好了,想要使用拿去就是了,為了節省你的力氣,父輩更是分門別類地把框架放在那里 ,就差你把自己的想法一個個安裝上去了!安卓是很方便,但是就像每個大家族都有一套完整的禁錮體系去鞏固家族的地位一樣,安卓這個大豪門也是有很多繁門襦節的.......下面就來看一看我是怎樣一步步地了解它的規則,實現它的方法的吧!
疑難雜症處處有,此處特別多:
第一點:像java一樣,首先你需要一個窗體,java用的一般是JFrame,而安卓用的是Activity。
public class mainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //獲取我們需要在安卓上要顯示的界面 setContentView(R.layout.activity_main); // 獲取登錄界面上的登錄按鈕 Button butLogin = (Button) this.findViewById(R.id.butLogin); // 實例化LoginListener事件處理類的對象 LoginListener ll = new LoginListener(this); // 要給事件源對象butLogin添加動作監聽方法指定事件處理類的對象ll butLogin.setOnClickListener(ll); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.draw, menu); return true; } }
“activity_main”這個指的是你在layout中設置的窗體樣式:
注釋:LinearLayout表示線性布局(包括垂直布局和水平布局)
orientation="vertical"表示的是垂直布局,orientation="horizontal"表示的是水平布局
android:gravity="top"(buttom、left、right、center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical、
clip_horizontal)控制布局中控件的對齊方式。
android:padding="20dp" 這個地方控制的是這個線性布局中所有控件離邊框的距離
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="@string/t" /> <EditText android:id="@+id/editName" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/e" /> </LinearLayout> //這一段表示的是賬號文本框和輸入框是在一根水平線上 <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="@string/t1" /> <EditText android:id="@+id/editPassword" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/e1" android:password="true" /> </LinearLayout>
padding與margin的區別
padding約束的是控件或布局顯示的內容距離邊框的距離,沿垂直邊框向內壓縮,padding越大,內容顯示控件越小;
margin這是沿垂直邊框向外延伸的距離, 它的意思就是給控件加了一個一定距離的空白邊,顯示效果只與值大小正負相關,與其他元素邊界無關。
第二點:添加監聽機制,並實現界面之間的跳轉(每一個界面都需要一個Activity)
頁面之間的跳轉在本次練習中實際上就是從activity_main.xml中設置的頁面跳轉到在draw.xml中設置的頁面,操作如下:
1.實例化Intent類的對象
Intent intent = new Intent();
2.設置從mainActivity跳轉到drawActivity
intent.setClass(ma,drawActivity.class);
3.使用mainActivity來啟動頁面的跳轉
ma.startActivity(intent);
4.轉到下一個界面后新建一個drawlistener去繼承Activity,獲得跳轉的頁面,操作如下:
獲取我們需要在安卓上要顯示的界面:
setContentView(R.layout.draw);
獲取事件源對象ImageView:
ImageView ivDrawing = (ImageView)this.findViewById(R.id.ivDrawing);
public class LoginListener implements OnClickListener { private mainActivity ma;//聲明一個Context上下文對象,該對象就是Activity的對象 //構造方法傳參 public LoginListener(mainActivity m){ ma = m; } public void onClick(View v) { //獲取事件源對象 Button butLogin = (Button)v; //測試語句 System.out.println("你點擊了"+butLogin.getText().toString()); Log.i("LoginListener", "你點擊了"+butLogin.getText().toString()); //顯示一個消息提示框,但是過一段時間,該提示框自動消失 Toast.makeText(ma, "你點擊了"+butLogin.getText().toString(), Toast.LENGTH_SHORT).show(); //實例化Intent類的對象 Intent intent = new Intent(); //設置從mainActivity跳轉到DrawActivity intent.setClass(ma,drawActivity.class); //使用mainActivity來啟動頁面的跳轉 ma.startActivity(intent); //ma.finish();//銷毀當前ma對象 } }
第三點:新建drawlistener去實現OnTouchListener的方法
.我們想要實現的是在跳轉頁面后在該頁面添加菜單以及實現菜單選項中的方法。
1.所以首先要把菜單和菜單中的項目添上去,這個很簡單,只需要在menu文件中新建一個draw.xml,然后定義所需菜單和項目的id和string,然后去string.xml中去命名所有的string,最后安卓中的R文件會自動生成並保存所有你設定的id和string,這個id和string就好比房間的門牌號和房間里的物品,安卓就是根據你給它的門牌號去找到你某年某月某日你存的東西拿出來給你用!
把界面添上去:
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.draw, menu); return true; }
2.接下來就是實現點擊菜單上的某個項目就實現它的功能:
在drawActivity中先設置獲得項目的id的方法
public boolean onOptionsItemSelected(MenuItem item) { dl.setItemId(item.getItemId()); return true; }
在drawlistener中獲取菜單上的id(舉例)
// 獲取菜單上的id public void setItemId(int item) { switch (item) { case R.id.color_Red: paint.setColor(Color.RED); break; case R.id.color_Green: paint.setColor(Color.GREEN); break;}
}
最后就是實現菜單上的每一個功能了,因為安卓的圖畫是畫在位圖上的,java是畫在窗體上,所以安卓就不需要重繪啦!但是安卓中要注意的是,把位圖添加到窗體上,即將bm位圖對象設置成ImageView要顯示的圖片: ivDraw.setImageBitmap(bm);
所以在畫圖之前首先要定義位圖,畫布,畫筆:
private Bitmap bm;// 位圖
private Canvas canvas;// 畫布,提供畫不同的圖形方法
private Paint paint;// 畫筆
然后判斷位圖是否為空,若為空就創建一個和ImageView一樣大小的32位真彩色位圖對象
if (bm == null) { ivDraw = (ImageView) v; // 創建一個和ImageView一樣大小的32位真彩色位圖對象。 bm = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888); // 根據bm位圖對象實例化一個Canvas對象 canvas = new Canvas(bm); }
具體的每一個功能的實現就如同下面的例子一樣了:
int action = event.getAction();// 獲取觸屏的動作 switch (action) { case MotionEvent.ACTION_DOWN: x1 = event.getX(); y1 = event.getY(); // 畫創意圖形 if (change.equals("net")) { chuangyi1();} break;}
3.在細節上我們是有很多需要注意的,例如:
a.java中使用畫直線的方法畫點的而java中有直接畫點的方法;
b.安卓中的很多畫圖方法和java中的有許多細微的差別,所以要注意畫圖方法的參數的數據類型以及參數表示的含義:
例如:void android.graphics.Canvas.drawRect(float left, float top, float right, float bottom, Paint paint);java中的畫矩形的方法是獲得一個點的坐標以及矩形的寬和高,而安卓則不同:
這樣的例子是數不勝數的,一定要多加注意。
運行的結果:
oh!終於寫完啦!