歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android開發:Bitmap和canvas的應用

Android開發:Bitmap和canvas的應用

日期:2017/3/1 11:17:18   编辑:Linux編程
Android開發:Bitmap和canvas的應用
  1. 畫虛線<div>SET_WALLPAPER </div>
  1. public class Canvas extends Activity implements OnTouchListener {
  2. /** Called when the activity is first created. */
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. this.requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉標題欄
  7. this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  8. WindowManager.LayoutParams.FLAG_FULLSCREEN);// 去掉信息欄
  9. setContentView(R.layout.main);
  10. iv = new ImageView(this);
  11. bitmap = Bitmap.createBitmap(800, 480, Bitmap.Config.ARGB_8888);
  12. iv.setImageBitmap(bitmap);
  13. LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
  14. ll.addView(iv, new LayoutParams(800, 480));
  15. ll.setOnTouchListener(this);
  16. }
  17. private android.graphics.Canvas myCanvas;
  18. private Bitmap bitmap;
  19. private Paint myPaint;
  20. private ImageView iv;
  21. private float left;
  22. private float top;
  23. @Override
  24. public boolean onTouch(View v, MotionEvent event) {
  25. switch (event.getAction()) {
  26. case MotionEvent.ACTION_DOWN:
  27. myCanvas = new android.graphics.Canvas(bitmap);
  28. myPaint = new Paint();
  29. // myPaint.setAntiAlias(true);//抗鋸齒
  30. //
  31. // RectF oval = new RectF(0, 0, 200, 200);
  32. // myPaint.setColor(Color.DKGRAY);
  33. // myCanvas.drawArc(oval, 0, 360, true, myPaint);
  34. //
  35. // myPaint.setColor(Color.LTGRAY);
  36. //
  37. // myCanvas.drawArc(oval, 0, 320, true, myPaint);
  38. // RectF eyes = new RectF(100, 20, 130, 50);
  39. // myPaint.setColor(Color.RED);
  40. // myCanvas.drawArc(eyes, 0, 360, true, myPaint);
  41. // myCanvas.drawCircle(200, 300, 100, myPaint);
  42. System.out.println("======================");
  43. iv.setImageBitmap(bitmap);
  44. left = event.getX();
  45. top = event.getY();
  46. break;
  47. case MotionEvent.ACTION_MOVE:
  48. // myCanvas.drawPoint(event.getX(), event.getY(), myPaint);
  49. // myPaint.setTypeface(Typeface.createFromFile("/sdcard/stxingka.ttf"));
  50. // myPaint.setTextSize(50);
  51. // myCanvas.drawText("Hello World!", event.getX(), event.getY(), myPaint);
  52. PathEffect pathEffect = new DashPathEffect(
  53. new float[] { 5, 5, 5, 5 }, 1);
  54. myPaint.setColor(Color.GREEN);
  55. myPaint.setPathEffect(pathEffect);
  56. myPaint.setStyle(Style.STROKE);
  57. myPaint.setStrokeWidth(3);
  58. myCanvas.drawARGB(255, 20, 30, 41);
  59. myCanvas.drawRect(new RectF(left, top, event.getX(), event.getY()),myPaint);
  60. iv.setImageBitmap(bitmap);
  61. break;
  62. case MotionEvent.ACTION_UP:
  63. break;
  64. }
  65. return true;
  66. }

一個讓Gridview項移動的例子:

  1. public class Utils {
  2. public static int[] image = { R.drawable.mb5u1_mb5ucom, R.drawable.mb5u2_mb5ucom,
  3. R.drawable.mb5u3_mb5ucom, R.drawable.mb5u4_mb5ucom,
  4. R.drawable.mb5u5_mb5ucom, R.drawable.mb5u6_mb5ucom,
  5. R.drawable.mb5u7_mb5ucom, R.drawable.mb5u8_mb5ucom,
  6. R.drawable.mb5u9_mb5ucom, R.drawable.mb5u10_mb5ucom,
  7. R.drawable.mb5u11_mb5ucom, R.drawable.mb5u12_mb5ucom,
  8. R.drawable.mb5u13_mb5ucom, R.drawable.mb5u14_mb5ucom,
  9. R.drawable.mb5u15_mb5ucom, R.drawable.mb5u16_mb5ucom,
  10. R.drawable.mb5u17_mb5ucom, R.drawable.mb5u18_mb5ucom,
  11. R.drawable.mb5u19_mb5ucom, R.drawable.mb5u20_mb5ucom,
  12. R.drawable.mb5u21_mb5ucom, R.drawable.mb5u22_mb5ucom,
  13. R.drawable.mb5u23_mb5ucom, R.drawable.mb5u24_mb5ucom,
  14. R.drawable.mb5u25_mb5ucom, R.drawable.mb5u26_mb5ucom,
  15. R.drawable.mb5u27_mb5ucom, R.drawable.mb5u28_mb5ucom,
  16. R.drawable.mb5u29_mb5ucom, R.drawable.mb5u30_mb5ucom,
  17. R.drawable.mb5u31_mb5ucom, R.drawable.mb5u32_mb5ucom,
  18. R.drawable.mb5u33_mb5ucom, R.drawable.mb5u34_mb5ucom,
  19. R.drawable.mb5u35_mb5ucom, R.drawable.mb5u36_mb5ucom,
  20. R.drawable.mb5u37_mb5ucom, R.drawable.mb5u38_mb5ucom,
  21. R.drawable.mb5u39_mb5ucom, R.drawable.mb5u40_mb5ucom,
  22. R.drawable.mb5u41_mb5ucom, R.drawable.mb5u42_mb5ucom,
  23. R.drawable.mb5u43_mb5ucom, R.drawable.mb5u44_mb5ucom };
  24. public static ArrayList<Map<String, Object>> getData() {
  25. ArrayList<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
  26. for (int i = 0; i < 23; i++) {
  27. Map<String, Object> map = new HashMap<String, Object>();
  28. map.put("img", image[i]);
  29. list.add(map);
  30. }
  31. return list;
  32. }

正式綁定

  1. public class MyGridViewDemo extends Activity implements OnTouchListener {
  2. private RelativeLayout myRl;
  3. private GridView myGridView;
  4. private ArrayList<Map<String, Object>> mArray;
  5. private MyAdapter adapter;
  6. private int mDragViewX;
  7. private int mDragViewY;
  8. @Override
  9. public void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. this.requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉標題欄
  12. this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  13. WindowManager.LayoutParams.FLAG_FULLSCREEN);// 去掉信息欄
  14. setContentView(R.layout.main);
  15. myRl = (RelativeLayout) findViewById(R.id.ll);
  16. myGridView = new GridView(this);
  17. mArray = Utils.getData();
  18. System.out.println(mArray.size());
  19. adapter = new MyAdapter(this, myGridView.getId(), mArray);
  20. myGridView.setAdapter(adapter);
  21. // GridView的列數
  22. myGridView.setNumColumns(5);
  23. myRl.addView(myGridView);
  24. myGridView.setOnTouchListener(this);
  25. }
  26. class MyAdapter extends ArrayAdapter<Map<String, Object>> {
  27. public MyAdapter(Context context, int textViewResourceId,
  28. List<Map<String, Object>> objects) {
  29. super(context, textViewResourceId, objects);
  30. }
  31. public ArrayList<Map<String, Object>> getList() {
  32. return mArray;
  33. }
  34. public View getView(int position, View convertView, ViewGroup parent) {
  35. View row = convertView;
  36. if (row == null) {
  37. LayoutInflater inflater = getLayoutInflater();
  38. row = (View) inflater.inflate(R.layout.mygrid_item, null);
  39. }
  40. ImageView imageView = (ImageView) row.findViewById(R.id.img);
  41. imageView.setImageResource(Integer.valueOf(mArray.get(position)
  42. .get("img").toString()));
  43. if (from == position) {
  44. imageView.setVisibility(View.INVISIBLE);
  45. } else if (View.INVISIBLE == imageView.getVisibility()) {
  46. imageView.setVisibility(View.VISIBLE);
  47. }
  48. Log.i("ivan", "position =" + position + "aniFrom =" + aniFrom
  49. + "aniTo" + aniTo);
  50. Animation ani = null;
  51. if (position > aniTo && position <= aniFrom) {
  52. if (position % 5 == 0) {
  53. ani = new TranslateAnimation(355, 0, -85, 0);
  54. } else {
  55. ani = new TranslateAnimation(-60, 0, 0, 0);
  56. }
  57. } else if (position < aniTo && position >= aniFrom) {
  58. if (position % 5 == 4) {
  59. ani = new TranslateAnimation(-355, 0, 85, 0);
  60. } else {
  61. ani = new TranslateAnimation(60, 0, 0, 0);
  62. }
  63. }
  64. if (ani != null) {
  65. ani.setAnimationListener(new AnimationListener() {
  66. @Override
  67. public void onAnimationStart(Animation animation) {
  68. // TODO Auto-generated method stub
  69. onAnimation = true;
  70. }
  71. @Override
  72. public void onAnimationRepeat(Animation animation) {
  73. // TODO Auto-generated method stub
  74. }
  75. @Override
  76. public void onAnimationEnd(Animation animation) {
  77. // TODO Auto-generated method stub
  78. onAnimation = false;
  79. }
  80. });
  81. ani.setDuration(500);
  82. imageView.setAnimation(ani);
  83. }
  84. return imageView;
  85. }
  86. }
  87. private boolean onAnimation = false;
  88. private int from = -1;
  89. private int to = -1;
  90. private int aniTo;
  91. private int aniFrom;
  92. @Override
  93. public boolean onTouch(View v, MotionEvent event) {
  94. int x = (int) event.getX();
  95. int y = (int) event.getY();
  96. int position = myGridView.pointToPosition(x, y);
  97. switch (event.getAction()) {
  98. case MotionEvent.ACTION_DOWN:
  99. // 如果沒有點擊到圖片直接break
  100. System.out.println("position =" + position);
  101. if (position == -1) {
  102. break;
  103. }
  104. // 獲取到點擊的View
  105. View tempView = myGridView.getChildAt(position
  106. - myGridView.getFirstVisiblePosition());
  107. System.out.println("tempView =" + tempView);
  108. if (tempView == null) {
  109. break;
  110. }
  111. // 開啟View的緩存
  112. tempView.setDrawingCacheEnabled(true);
  113. // tempView.getTop()獲取到tempView自身的位置,因為按下的時候應該顯示的位置和他自身的位置相同
  114. // tempView.getLeft() 同理
  115. startDragging(tempView.getDrawingCache(), tempView.getTop(),
  116. tempView.getLeft());
  117. // 獲取點擊的位置距所點擊圖片頂部的距離mDragViewX,mDragViewY
  118. mDragViewX = x - tempView.getLeft();
  119. mDragViewY = y - tempView.getTop();
  120. from = position;
  121. tempView.setVisibility(View.INVISIBLE);
  122. break;
  123. case MotionEvent.ACTION_MOVE:
  124. if (myDragView != null) {
  125. RelativeLayout.LayoutParams rllp = (LayoutParams) myDragView
  126. .getLayoutParams();
  127. rllp.leftMargin = x - mDragViewX;
  128. rllp.topMargin = y - mDragViewY;
  129. myDragView.setLayoutParams(rllp);
  130. }
  131. if (position != -1) {
  132. to = position;
  133. }
  134. Log.i("ivan", "form=" + from);
  135. if (from != to && from != -1 && to != -1 &&!onAnimation) {
  136. aniFrom = from;
  137. aniTo = to;
  138. Map<String, Object> temp = adapter.getItem(from);
  139. adapter.remove(temp);
  140. adapter.insert(temp, to);
  141. from = to;
  142. }
  143. break;
  144. case MotionEvent.ACTION_UP:
  145. if (myDragView != null) {
  146. // 把myDragView 從RelativeLayout中刪除
  147. myRl.removeView(myDragView);
  148. }
  149. // 獲取到松手位置的圖片讓其顯示
  150. View end = myGridView.getChildAt(from
  151. - myGridView.getFirstVisiblePosition());
  152. if (end != null) {
  153. end.setVisibility(View.VISIBLE);
  154. }
  155. from = -1;
  156. to = -1;
  157. break;
  158. }
  159. return true;
  160. }
  161. private ImageView myDragView;
  162. private void startDragging(Bitmap tempBitmap, int top, int left) {
  163. ImageView iv = new ImageView(getApplication());
  164. RelativeLayout.LayoutParams rllp = new RelativeLayout.LayoutParams(-2,
  165. -2);
  166. rllp.leftMargin = left;
  167. rllp.topMargin = top;
  168. iv.setImageBitmap(tempBitmap);
  169. // 測試方法看iv是否有值 作用是讓此View填充全屏
  170. // setContentView(iv);
  171. myDragView = iv;
  172. myRl.addView(myDragView, rllp);
  173. // 兩種寫法一樣
  174. // mDragView.setLayoutParams(rllp);
  175. // rl.addView(mDragView);
  176. }

---------------------------------------------

dragwindow 圖片拖動

  1. public class DragwindowActivity extends Activity {
  2. /** Called when the activity is first created. */
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. //setContentView(R.layout.main);
  7. //設置窗體的屬性
  8. WindowManager.LayoutParams params = new LayoutParams();
  9. params.height = WindowManager.LayoutParams.FILL_PARENT;
  10. params.width = WindowManager.LayoutParams.FILL_PARENT;
  11. params.format = PixelFormat.TRANSLUCENT;
  12. DisplayMetrics dm = getResources().getDisplayMetrics();
  13. final int screenWidth = dm.widthPixels;
  14. final int screenHeight = dm.heightPixels-50; //拖動窗體內的范圍
  15. //把要拖動view布局文件孵化成view
  16. LayoutInflater inflater = LayoutInflater.from(this);
  17. View view = inflater.inflate(R.layout.main, null);
  18. ImageButton button = (ImageButton) view.findViewById(R.id.ib_tt);
  19. button.setOnTouchListener(new OnTouchListener() {
  20. int lastX,lastY; //焦點
  21. @Override
  22. public boolean onTouch(View v, MotionEvent event) {
  23. int me = event.getAction();
  24. Log.i("TAG", "Touch:"+me); //按下是0,拖動是2,彈起是1;
  25. switch(me){
  26. case MotionEvent.ACTION_DOWN:
  27. lastX = (int) event.getRawX();
  28. lastY = (int) event.getRawY();
  29. Log.i("TAG", "down x="+lastX+" ,y="+lastY);
  30. break;
  31. case MotionEvent.ACTION_MOVE:
  32. int dx = (int) event.getRawX()-lastX;
  33. int dy = (int) event.getRawY()-lastY;
  34. Log.i("TAG", "d x="+dx+" ,d y="+dy); //拖動的坐標
  35. //拖動移位後的坐標
  36. int left = v.getLeft() + dx;
  37. int top = v.getTop() + dy;
  38. int right = v.getRight() + dx;
  39. int bottom = v.getBottom() + dy;
  40. if(left<0){
  41. left = 0;
  42. right=left+v.getWidth();
  43. }
  44. if(right>screenWidth){
  45. right=screenWidth;
  46. left = right-v.getWidth();
  47. }
  48. if(top<0){
  49. top=0;
  50. bottom = top+v.getHeight();
  51. }
  52. if(bottom>screenHeight){
  53. bottom = screenHeight;
  54. top = bottom - v.getHeight();
  55. }
  56. v.layout(left, top, right, bottom);
  57. lastX = (int) event.getRawX();
  58. lastY = (int) event.getRawY();
  59. break;
  60. case MotionEvent.ACTION_UP:
  61. break;
  62. }
  63. return false;
  64. }
  65. });
  66. WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE);
  67. manager.addView(view, params);
  68. }

----------------------讀取相冊--畫圖保存

  1. ImageView iv1;
  2. Canvas canvas ;
  3. Bitmap alteredBitmap;
  4. /** Called when the activity is first created. */
  5. @Override
  6. public void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.main);
  9. iv1 =(ImageView) findViewById(R.id.iv1);
  10. iv1.setOnTouchListener(this);
  11. }
  12. public void selectImage(View view) {
  13. Intent intent = new Intent(Intent.ACTION_PICK);
  14. intent.setType("image/*");
  15. startActivityForResult(intent, 200);
  16. }
  17. public void saveImage(View view){
  18. try {
  19. Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues());
  20. OutputStream os = getContentResolver().openOutputStream(uri);
  21. Boolean result = alteredBitmap.compress(CompressFormat.JPEG, 50, os);
  22. if(result){
  23. Toast.makeText(this, "保存成功", 1).show();
  24. Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://"+Environment.getExternalStorageDirectory()));
  25. sendBroadcast(intent);
  26. }else{
  27. Toast.makeText(this, "保存失敗", 1).show();
  28. }
  29. } catch (FileNotFoundException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. @Override
  34. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  35. super.onActivityResult(requestCode, resultCode, data);
  36. if (requestCode == 200) {
  37. Uri uri = data.getData();
  38. try {
  39. // InputStream is =getContentResolver().openInputStream(uri);
  40. //得到屏幕大小
  41. Display currentDisplay = getWindowManager().getDefaultDisplay();
  42. int dw = currentDisplay.getWidth();
  43. int dh = currentDisplay.getHeight();
  44. System.out.println(dw+"--"+dh);
  45. BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
  46. // 如果設置了injustDecodeBounds這個屬性,不會真的解析bitmap,只返回bitmap的寬高和圖片屬性
  47. bmpFactoryOptions.inJustDecodeBounds = true;
  48. Bitmap bmp = BitmapFactory.decodeFile("/sdcard/066.JPG",
  49. bmpFactoryOptions); //參數傳入只為得到bmp圖屬性 ,再縮小
  50. int heightRatio = (int) Math.ceil(bmpFactoryOptions.outHeight
  51. / (float) dh);
  52. int widthRatio = (int) Math.ceil(bmpFactoryOptions.outWidth
  53. / (float) dw);
  54. // 判斷是否要進行縮放
  55. if (heightRatio > 1 && widthRatio > 1) {
  56. if (heightRatio > widthRatio) {
  57. // 高度變化大,按高度縮放
  58. bmpFactoryOptions.inSampleSize = heightRatio;
  59. } else {
  60. // 寬度變化大,按寬度縮放
  61. bmpFactoryOptions.inSampleSize = widthRatio;
  62. }
  63. }
  64. // 把inJustDecodeBounds設置為false,這樣才會真正的decode這個位圖
  65. bmpFactoryOptions.inJustDecodeBounds = false;
  66. //得到新圖片流
  67. InputStream newis = getContentResolver().openInputStream(uri);
  68. bmp = BitmapFactory.decodeStream(newis, null, bmpFactoryOptions);
  69. // 創建一個bitmap的拷貝
  70. // 創建了一個空的bitmap ,用原來的參數填充
  71. alteredBitmap = Bitmap.createBitmap(bmp.getWidth(),
  72. bmp.getHeight(), bmp.getConfig());
  73. // 創建一個畫布
  74. canvas = new Canvas(alteredBitmap);
  75. // 創建一個畫筆
  76. Paint paint = new Paint();
  77. Matrix matrix = new Matrix();
  78. canvas.drawBitmap(bmp, matrix, paint);
  79. iv1.setImageBitmap(alteredBitmap);
  80. } catch (FileNotFoundException e) {
  81. e.printStackTrace();
  82. }
  83. }
  84. }
  85. float downx = 0;
  86. float downy = 0;
  87. float upx = 0;
  88. float upy = 0;
  89. @Override
  90. public boolean onTouch(View v, MotionEvent event) {
  91. int eventtype = event.getAction();
  92. Paint paint = new Paint();
  93. paint.setColor(Color.GREEN);
  94. paint.setStrokeWidth(5);
  95. switch (eventtype) {
  96. case MotionEvent.ACTION_DOWN:
  97. downx = event.getX();
  98. downy = event.getY();
  99. break;
  100. case MotionEvent.ACTION_MOVE:
  101. upx = event.getX();
  102. upy = event.getY();
  103. canvas.drawLine(downx, downy, upx, upy, paint);
  104. iv1.invalidate();
  105. downx = upx;
  106. downy = upy;
  107. break;
  108. case MotionEvent.ACTION_UP:
  109. upx = event.getX();
  110. upy = event.getY();
  111. canvas.drawLine(downx, downy, upx, upy, paint);
  112. iv1.invalidate();
  113. break;
  114. }
  115. return true;
  116. }
Copyright © Linux教程網 All Rights Reserved