android開發之畫圖版
一.新的開始,也是新的挑戰:
- 開始學習java,除了剛開始的時候有些難,覺得難有些暈,慢慢接觸之后也就挺好的了, 學習了4天的安卓開發,完成了一個小程序,收獲還是不小的;有一些java的基礎,所以相對的畫圖板還是比較簡單(對於理解代碼而言);但是因為android和java有不一樣的地方,所以有些地方應該要注意;不管怎么說新鮮的東西,新的起點。頑張って。
二.初識android:
- android開發,第一個印象就是,測試麻煩;要用虛擬機或者接上手機,第一次測試的時候,挺不習慣的。
- 第二點:界面是在layout上面設置的,android開發像是把很多的東西都分門別類了一樣,有圖片的文件包,有id,有value包;所以說,剛開始的時候,了解每個包的作用是開始的第一步。
- 在android開發中,有一點不習慣的是android的界面,並不像java中的那樣是畫在JFrame中。首先是在xml文件中用線性布局來設計的,一個垂直的線性布局(LinearLayout)中添加幾個水平的線性布局來使用。雖然剛開始的時候放了很多的錯誤,用錯了方法,不熟悉開發的軟件,不過最后還是完成了。下面是layout中組件與組件中控制距離的方法,
- 另外和java不同的是,設置顏色的方法;在java中Color是一個類,但是android開發里面用的是十六進制來表示;雖然系統會自帶一些顏色,不過要定義新的顏色的時候,就不能像java中那樣,new 一個Color對象;而是:paint.setTextColor(0xffff00ff);//其中:0xffff00ff是int類型的數據,分組一下0x|ff|ff00ff,0x表示顏色整數的標記,ff表示透明度,ff00ff表示色值,注意:0x后面ffff00ff必須是8位的顏色表示。顏色和不透度 (alpha) 值以十六進制表示法表示。任何一種顏色的值范圍都是 0到 255(00到 ff)。對於 alpha,00表示完全透明,ff表示完全不透明。表達式順序是“aabbggrr”,其中“aa=alpha”(00到ff);“bb=blue”(00到ff);“gg=green”(00到ff);“rr=red”(00到ff)。
- 設置顏色的幾種方法:
- 在xml文件中設置顏色的方法只能是 android:textColor="#FFFFFF"
三.畫圖版:
- 這次做了一個自己的畫圖版,因為之前已經寫過,所以花的時間不是很長,也比較容易,不過代碼中值得注意的是還是有很多的;
- 第一點添加監聽:
- 第一個就是監聽方法的不一樣:java中用的是add...,而android中使用的set...,android中OnClickListener用來監聽鼠標點擊相當於java中的ActionListener,OnTouchListener接口是用來處理手機屏幕事件的監聽接口,當為View的范圍內觸摸按下、抬起或滑動等動作時都會觸發該事件。
-
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button=(Button)findViewById(R.id.Button);//獲取按鈕對象; Loginlistenner l=new Loginlistenner(); button.setOnClickListener(l);//給按鈕加上監聽; l.setMa(this); }
-
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); ImageView im=(ImageView)this.findViewById(R.id.imafeview1);//獲取事件對象 l=new Drawlisteners(this); im.setOnTouchListener(l);//給圖片加上監聽,也就是位圖要顯示的位置; }
- 第二實現頁面的跳轉:
- 當點擊之后要進入一個新的界面的時候使用的是Intent:
- Intent是一種運行時綁定(runtime binding)機制,它能在程序運行的過程中連接兩個不同的組件。 通過Intent,你的程序可以向Android表達某種請求或者意願,Android會根據意願的內容選擇適當的組件來響應。 Intent不僅可用於應用程序之間,也可用於應用程序內部的Activity/Service之間的交互。
- 代碼:在public void onClick(View v) {}中:
Intent intent = new Intent(); intent.setClass(ma, DrawActivity.class); ma.startActivity(intent); //setClass函數的第一個參數是一個Context對象 //Context是一個類,Activity是Context類的子類,也就是說, //所有的Activity對象,都可以向上轉型為Context對象 //setClass函數的第二個參數是一個Class對象, //在當前場景下,應該傳入需要被啟動的Activity類的class對象
- 第三:畫筆,畫布的實現(畫圖功能):
- android中畫圖時 使用Paint畫筆,畫在Canvas畫布上,再存到Bitmap位圖上面,然后再把位圖放到ImagineView上面
- 在當位圖為空時,在onTouch(View v, MotionEvent event){}函數中,創建位圖,然后根據位圖創建Canvas畫布上,代碼:
-
if (bt == null) { PaintFlagsDrawFilter mSetfil = new PaintFlagsDrawFilter(0, Paint.FILTER_BITMAP_FLAG); ima = (ImageView) v;// 獲取對象; bt = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888); cn = new Canvas(bt); cn.setDrawFilter(mSetfil); }
- 然后是把畫布放到放到ImagineView上: ima.setImageBitmap(bt);
- 第四:菜單:
- 在Activity函數里面重寫onCreateOptionsMenu方法新建一個菜單;同時在menu中新建一個菜單文件。
- Activity函數中的代碼:
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.draw, menu); return true; }
- 重寫activity類的
onOptionsItemSelected(MenuItem)
回調方法,每當有菜單項被點擊時,android就會調用該方法,並傳入被點擊菜單項,代碼: -
@Override public boolean onOptionsItemSelected(MenuItem item) { l.setItemId(item.getItemId());//傳到監聽方法中去; return true; }
- 把item.getItemId()獲取的信息傳入listener類中(該類繼承了OnTouchListener),利用switch 語句來實現菜單功能;
-
public void setItemId(int itemid) { switch (itemid) { case R.id.itm2: pain.setColor(0xffFF69B4);// 紅 break; case R.id.itm3: pain.setColor(0xff90EE90);// 綠 break; case R.id.ite2: // 畫一個空心圓,改變畫筆的風格; /*設置paint的 style 為STROKE:空心*/ pain.setStyle(Style.STROKE); break; case R.id.ite1: pain.setStyle(Style.FILL);//fill為實心 break; case R.id.itme2: type = "line"; break; case R.id.itme3: type = "oval"; break; } }
- 在onTouch(View v, MotionEvent event){}函數中(監聽方法中)實現畫圖功能;
- MotionEvent.ACTION_DOWN:按下
- MotionEvent.ACTION_UP:松開
- MotionEvent.ACTION_MOVE:移動
int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: x1 = event.getX(); y1 = event.getY(); if (type.equals("三角金字塔形")) { drawsanjiaojinzita((int) x1, (int) y1); } else if (type.equals("角")) { drawjiao(); break; case MotionEvent.ACTION_UP: x2 = event.getX(); y2 = event.getY(); pain.setStrokeWidth((float) 3.0); if (type.equals("line")) { cn.drawLine(x1, y1, x2, y2, pain); } else if (type.equals("path")) { Path path4 = new Path(); path4.moveTo(x1, y1); path4.lineTo(x2, y2); path4.lineTo((x1 + 50), (y2 + 10)); path4.close(); cn.drawPath(path4, pain);// 畫一個三角形; } else if (type.equals("文字")) { pain.setTextSize(50); cn.drawText("雅雅最棒", x1, y1, pain); } else if (type.equals("")) { cn.drawLine(x1, y1, x2, y2, pain); } // cn.drawCoslor(Color.WHITE);//窗體會畫白;之前畫的圖形會消失;(新建); ima.setImageBitmap(bt); break; } return true;// 返回值false,表示該方法執行失敗, // 之前所有執行過的代碼都將回滾。 }
- 在xml 文件中設置菜單顯示在窗體上<!-- android:showAsAction="always" 一直顯示在窗體上 -->
- 使用畫筆和畫布的時候應該注意:
- 畫筆和畫布設置顏色可以使用十六進制或者使用系統自帶的顏色;
- 函數的不同:java中畫點是利用畫直線的方法,而android里面是有專門的方法:canvas.drawPoint((x3 + x), (y3 + y), paint);
- draw函數中的數值都是float型;
- 在畫矩形的函數中
void android.graphics.Canvas.drawRect(float left, float top, float right, float bottom, Paint paint):left是矩形左邊的線,top是上面;right是右邊,bottom是下面的線。
-
畫圖的抗鋸齒效果:(1)對畫筆進行抗鋸齒:pain.setAlpha(50); pain.setAntiAlias(true);// 改變鋸齒狀;(2)創建一個Paint濾波器。 PaintFlagsDrawFilter mSetfil = new PaintFlagsDrawFilter(0, Paint.FILTER_BITMAP_FLAG); canvas.setDrawFilter( mSetfil ); 第一個參數是你要清除的標志位,第二個參數是你要設置的標志位。此處設置為對位圖進行濾波;
- 提示。點擊按鈕出現提示;顯示一個消息提示框,
- Toast.makeText(ma, button.getText().toString(),Toast.LENGTH_SHORT).show();