画虚线SET_WALLPAPER
public class Canvas extends Activity implements OnTouchListener { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 去掉信息栏 setContentView(R.layout.main); iv = new ImageView(this); bitmap = Bitmap.createBitmap(800, 480, Bitmap.Config.ARGB_8888); iv.setImageBitmap(bitmap); LinearLayout ll = (LinearLayout) findViewById(R.id.ll); ll.addView(iv, new LayoutParams(800, 480)); ll.setOnTouchListener(this); } private android.graphics.Canvas myCanvas; private Bitmap bitmap; private Paint myPaint; private ImageView iv; private float left; private float top; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: myCanvas = new android.graphics.Canvas(bitmap); myPaint = new Paint(); // myPaint.setAntiAlias(true);//抗锯齿 // // RectF oval = new RectF(0, 0, 200, 200); // myPaint.setColor(Color.DKGRAY); // myCanvas.drawArc(oval, 0, 360, true, myPaint); // // myPaint.setColor(Color.LTGRAY); // // myCanvas.drawArc(oval, 0, 320, true, myPaint); // RectF eyes = new RectF(100, 20, 130, 50); // myPaint.setColor(Color.RED); // myCanvas.drawArc(eyes, 0, 360, true, myPaint); // myCanvas.drawCircle(200, 300, 100, myPaint); System.out.println("======================"); iv.setImageBitmap(bitmap); left = event.getX(); top = event.getY(); break; case MotionEvent.ACTION_MOVE: // myCanvas.drawPoint(event.getX(), event.getY(), myPaint); // myPaint.setTypeface(Typeface.createFromFile("/sdcard/stxingka.ttf")); // myPaint.setTextSize(50); // myCanvas.drawText("Hello World!", event.getX(), event.getY(), myPaint); PathEffect pathEffect = new DashPathEffect( new float[] { 5, 5, 5, 5 }, 1); myPaint.setColor(Color.GREEN); myPaint.setPathEffect(pathEffect); myPaint.setStyle(Style.STROKE); myPaint.setStrokeWidth(3); myCanvas.drawARGB(255, 20, 30, 41); myCanvas.drawRect(new RectF(left, top, event.getX(), event.getY()),myPaint); iv.setImageBitmap(bitmap); break; case MotionEvent.ACTION_UP: break; } return true; }
一个让Gridview项移动的例子:
public class Utils { public static int[] image = { R.drawable.mb5u1_mb5ucom, R.drawable.mb5u2_mb5ucom, R.drawable.mb5u3_mb5ucom, R.drawable.mb5u4_mb5ucom, R.drawable.mb5u5_mb5ucom, R.drawable.mb5u6_mb5ucom, R.drawable.mb5u7_mb5ucom, R.drawable.mb5u8_mb5ucom, R.drawable.mb5u9_mb5ucom, R.drawable.mb5u10_mb5ucom, R.drawable.mb5u11_mb5ucom, R.drawable.mb5u12_mb5ucom, R.drawable.mb5u13_mb5ucom, R.drawable.mb5u14_mb5ucom, R.drawable.mb5u15_mb5ucom, R.drawable.mb5u16_mb5ucom, R.drawable.mb5u17_mb5ucom, R.drawable.mb5u18_mb5ucom, R.drawable.mb5u19_mb5ucom, R.drawable.mb5u20_mb5ucom, R.drawable.mb5u21_mb5ucom, R.drawable.mb5u22_mb5ucom, R.drawable.mb5u23_mb5ucom, R.drawable.mb5u24_mb5ucom, R.drawable.mb5u25_mb5ucom, R.drawable.mb5u26_mb5ucom, R.drawable.mb5u27_mb5ucom, R.drawable.mb5u28_mb5ucom, R.drawable.mb5u29_mb5ucom, R.drawable.mb5u30_mb5ucom, R.drawable.mb5u31_mb5ucom, R.drawable.mb5u32_mb5ucom, R.drawable.mb5u33_mb5ucom, R.drawable.mb5u34_mb5ucom, R.drawable.mb5u35_mb5ucom, R.drawable.mb5u36_mb5ucom, R.drawable.mb5u37_mb5ucom, R.drawable.mb5u38_mb5ucom, R.drawable.mb5u39_mb5ucom, R.drawable.mb5u40_mb5ucom, R.drawable.mb5u41_mb5ucom, R.drawable.mb5u42_mb5ucom, R.drawable.mb5u43_mb5ucom, R.drawable.mb5u44_mb5ucom }; public static ArrayList<Map<String, Object>> getData() { ArrayList<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); for (int i = 0; i < 23; i++) { Map<String, Object> map = new HashMap<String, Object>(); map.put("img", image[i]); list.add(map); } return list; }
正式绑定
public class MyGridViewDemo extends Activity implements OnTouchListener { private RelativeLayout myRl; private GridView myGridView; private ArrayList<Map<String, Object>> mArray; private MyAdapter adapter; private int mDragViewX; private int mDragViewY; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 去掉信息栏 setContentView(R.layout.main); myRl = (RelativeLayout) findViewById(R.id.ll); myGridView = new GridView(this); mArray = Utils.getData(); System.out.println(mArray.size()); adapter = new MyAdapter(this, myGridView.getId(), mArray); myGridView.setAdapter(adapter); // GridView的列数 myGridView.setNumColumns(5); myRl.addView(myGridView); myGridView.setOnTouchListener(this); } class MyAdapter extends ArrayAdapter<Map<String, Object>> { public MyAdapter(Context context, int textViewResourceId, List<Map<String, Object>> objects) { super(context, textViewResourceId, objects); } public ArrayList<Map<String, Object>> getList() { return mArray; } public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; if (row == null) { LayoutInflater inflater = getLayoutInflater(); row = (View) inflater.inflate(R.layout.mygrid_item, null); } ImageView imageView = (ImageView) row.findViewById(R.id.img); imageView.setImageResource(Integer.valueOf(mArray.get(position) .get("img").toString())); if (from == position) { imageView.setVisibility(View.INVISIBLE); } else if (View.INVISIBLE == imageView.getVisibility()) { imageView.setVisibility(View.VISIBLE); } Log.i("ivan", "position =" + position + "aniFrom =" + aniFrom + "aniTo" + aniTo); Animation ani = null; if (position > aniTo && position <= aniFrom) { if (position % 5 == 0) { ani = new TranslateAnimation(355, 0, -85, 0); } else { ani = new TranslateAnimation(-60, 0, 0, 0); } } else if (position < aniTo && position >= aniFrom) { if (position % 5 == 4) { ani = new TranslateAnimation(-355, 0, 85, 0); } else { ani = new TranslateAnimation(60, 0, 0, 0); } } if (ani != null) { ani.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { // TODO Auto-generated method stub onAnimation = true; } @Override public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animation animation) { // TODO Auto-generated method stub onAnimation = false; } }); ani.setDuration(500); imageView.setAnimation(ani); } return imageView; } } private boolean onAnimation = false; private int from = -1; private int to = -1; private int aniTo; private int aniFrom; @Override public boolean onTouch(View v, MotionEvent event) { int x = (int) event.getX(); int y = (int) event.getY(); int position = myGridView.pointToPosition(x, y); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 如果没有点击到图片直接break System.out.println("position =" + position); if (position == -1) { break; } // 获取到点击的View View tempView = myGridView.getChildAt(position - myGridView.getFirstVisiblePosition()); System.out.println("tempView =" + tempView); if (tempView == null) { break; } // 开启View的缓存 tempView.setDrawingCacheEnabled(true); // tempView.getTop()获取到tempView自身的位置,因为按下的时候应该显示的位置和他自身的位置相同 // tempView.getLeft() 同理 startDragging(tempView.getDrawingCache(), tempView.getTop(), tempView.getLeft()); // 获取点击的位置距所点击图片顶部的距离mDragViewX,mDragViewY mDragViewX = x - tempView.getLeft(); mDragViewY = y - tempView.getTop(); from = position; tempView.setVisibility(View.INVISIBLE); break; case MotionEvent.ACTION_MOVE: if (myDragView != null) { RelativeLayout.LayoutParams rllp = (LayoutParams) myDragView .getLayoutParams(); rllp.leftMargin = x - mDragViewX; rllp.topMargin = y - mDragViewY; myDragView.setLayoutParams(rllp); } if (position != -1) { to = position; } Log.i("ivan", "form=" + from); if (from != to && from != -1 && to != -1 &&!onAnimation) { aniFrom = from; aniTo = to; Map<String, Object> temp = adapter.getItem(from); adapter.remove(temp); adapter.insert(temp, to); from = to; } break; case MotionEvent.ACTION_UP: if (myDragView != null) { // 把myDragView 从RelativeLayout中删除 myRl.removeView(myDragView); } // 获取到松手位置的图片让其显示 View end = myGridView.getChildAt(from - myGridView.getFirstVisiblePosition()); if (end != null) { end.setVisibility(View.VISIBLE); } from = -1; to = -1; break; } return true; } private ImageView myDragView; private void startDragging(Bitmap tempBitmap, int top, int left) { ImageView iv = new ImageView(getApplication()); RelativeLayout.LayoutParams rllp = new RelativeLayout.LayoutParams(-2, -2); rllp.leftMargin = left; rllp.topMargin = top; iv.setImageBitmap(tempBitmap); // 测试方法看iv是否有值 作用是让此View填充全屏 // setContentView(iv); myDragView = iv; myRl.addView(myDragView, rllp); // 两种写法一样 // mDragView.setLayoutParams(rllp); // rl.addView(mDragView); }
---------------------------------------------
dragwindow 图片拖动
public class DragwindowActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.main); //设置窗体的属性 WindowManager.LayoutParams params = new LayoutParams(); params.height = WindowManager.LayoutParams.FILL_PARENT; params.width = WindowManager.LayoutParams.FILL_PARENT; params.format = PixelFormat.TRANSLUCENT; DisplayMetrics dm = getResources().getDisplayMetrics(); final int screenWidth = dm.widthPixels; final int screenHeight = dm.heightPixels-50; //拖动窗体内的范围 //把要拖动view布局文件孵化成view LayoutInflater inflater = LayoutInflater.from(this); View view = inflater.inflate(R.layout.main, null); ImageButton button = (ImageButton) view.findViewById(R.id.ib_tt); button.setOnTouchListener(new OnTouchListener() { int lastX,lastY; //焦点 @Override public boolean onTouch(View v, MotionEvent event) { int me = event.getAction(); Log.i("TAG", "Touch:"+me); //按下是0,拖动是2,弹起是1; switch(me){ case MotionEvent.ACTION_DOWN: lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); Log.i("TAG", "down x="+lastX+" ,y="+lastY); break; case MotionEvent.ACTION_MOVE: int dx = (int) event.getRawX()-lastX; int dy = (int) event.getRawY()-lastY; Log.i("TAG", "d x="+dx+" ,d y="+dy); //拖动的坐标 //拖动移位后的坐标 int left = v.getLeft() + dx; int top = v.getTop() + dy; int right = v.getRight() + dx; int bottom = v.getBottom() + dy; if(left<0){ left = 0; right=left+v.getWidth(); } if(right>screenWidth){ right=screenWidth; left = right-v.getWidth(); } if(top<0){ top=0; bottom = top+v.getHeight(); } if(bottom>screenHeight){ bottom = screenHeight; top = bottom - v.getHeight(); } v.layout(left, top, right, bottom); lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); break; case MotionEvent.ACTION_UP: break; } return false; } }); WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE); manager.addView(view, params); }
----------------------读取相册--画图保存
ImageView iv1; Canvas canvas ; Bitmap alteredBitmap; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); iv1 =(ImageView) findViewById(R.id.iv1); iv1.setOnTouchListener(this); } public void selectImage(View view) { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); startActivityForResult(intent, 200); } public void saveImage(View view){ try { Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues()); OutputStream os = getContentResolver().openOutputStream(uri); Boolean result = alteredBitmap.compress(CompressFormat.JPEG, 50, os); if(result){ Toast.makeText(this, "保存成功", 1).show(); Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://"+Environment.getExternalStorageDirectory())); sendBroadcast(intent); }else{ Toast.makeText(this, "保存失败", 1).show(); } } catch (FileNotFoundException e) { e.printStackTrace(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 200) { Uri uri = data.getData(); try { // InputStream is =getContentResolver().openInputStream(uri); //得到屏幕大小 Display currentDisplay = getWindowManager().getDefaultDisplay(); int dw = currentDisplay.getWidth(); int dh = currentDisplay.getHeight(); System.out.println(dw+"--"+dh); BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options(); // 如果设置了injustDecodeBounds这个属性,不会真的解析bitmap,只返回bitmap的宽高和图片属性 bmpFactoryOptions.inJustDecodeBounds = true; Bitmap bmp = BitmapFactory.decodeFile("/sdcard/066.JPG", bmpFactoryOptions); //参数传入只为得到bmp图属性 ,再缩小 int heightRatio = (int) Math.ceil(bmpFactoryOptions.outHeight / (float) dh); int widthRatio = (int) Math.ceil(bmpFactoryOptions.outWidth / (float) dw); // 判断是否要进行缩放 if (heightRatio > 1 && widthRatio > 1) { if (heightRatio > widthRatio) { // 高度变化大,按高度缩放 bmpFactoryOptions.inSampleSize = heightRatio; } else { // 宽度变化大,按宽度缩放 bmpFactoryOptions.inSampleSize = widthRatio; } } // 把inJustDecodeBounds设置为false,这样才会真正的decode这个位图 bmpFactoryOptions.inJustDecodeBounds = false; //得到新图片流 InputStream newis = getContentResolver().openInputStream(uri); bmp = BitmapFactory.decodeStream(newis, null, bmpFactoryOptions); // 创建一个bitmap的拷贝 // 创建了一个空的bitmap ,用原来的参数填充 alteredBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig()); // 创建一个画布 canvas = new Canvas(alteredBitmap); // 创建一个画笔 Paint paint = new Paint(); Matrix matrix = new Matrix(); canvas.drawBitmap(bmp, matrix, paint); iv1.setImageBitmap(alteredBitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } } float downx = 0; float downy = 0; float upx = 0; float upy = 0; @Override public boolean onTouch(View v, MotionEvent event) { int eventtype = event.getAction(); Paint paint = new Paint(); paint.setColor(Color.GREEN); paint.setStrokeWidth(5); switch (eventtype) { case MotionEvent.ACTION_DOWN: downx = event.getX(); downy = event.getY(); break; case MotionEvent.ACTION_MOVE: upx = event.getX(); upy = event.getY(); canvas.drawLine(downx, downy, upx, upy, paint); iv1.invalidate(); downx = upx; downy = upy; break; case MotionEvent.ACTION_UP: upx = event.getX(); upy = event.getY(); canvas.drawLine(downx, downy, upx, upy, paint); iv1.invalidate(); break; } return true; }