android自定义View实现裁剪图片功能,不使用系统的

闲来无事,今天写了一下怎么裁剪图片,写的很烂,放在这里以后看看自己有没有进步.............

首先给个效果图了...........

1,拖动矩形框,红色矩形框以外是一个半透明的罩,通过画出四个半透明的矩形,可以实现效果


2,拖动红框及拉伸红框获取坐标,拉伸只能通过红框的上面那个红线点击向外移动放大,向左里移动缩小,哈哈,还有很多地方没有做,不想做了,懒啊,有想法的时候再做吧.......


3,点击红框以外的地方时候,会保存裁剪图片,最后点击save去掉自定义的view,把裁剪的图片放在imageview里面。(底层有个图片是本身imageview有的哦)


代码实现:

自定义view:

package com.zte.caijian;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

public class myView extends View {

	private int l = 20;
	private int t = 20;
	private int r = 100;
	private int b = 100;

	Bitmap bitmap;
	Bitmap bitmapOld;

	@SuppressLint({ "NewApi", "NewApi" })
	public myView(Context context, Bitmap bitmap) {
		super(context);
		this.bitmap = Bitmap.createScaledBitmap(bitmap, 480, 540, true);
		// setBackgroundColor(Color.BLACK);
		// setAlpha(0.8f);
	}

	int xy[] = new int[2];
	int temp[] = new int[2];

	int tempM[] = new int[2];
	boolean mFlag = false;
	boolean mFlagM = false;
	boolean mFlag1 = false;
	boolean mFlag2 = false;
	boolean kaishi = true;
	int change = 0;

	@Override
	public boolean onTouchEvent(MotionEvent event) {

		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			xy[0] = (int) event.getX();
			xy[1] = (int) event.getY();
			if (xy[0] < r && xy[0] > l && xy[1] < b && xy[1] > t) {
				mFlag2 = false;
				mFlag = true;
				mFlag1 = false;
			} else {
				mFlag = false;

			}
			if (xy[0] < r && xy[0] > l && xy[1] == t) {
				mFlag1 = true;

			} else {

				if (tmL == 0 || tmR == 0 || tmT == 0) {

				} else {
					if (bitmapOld == null) {
						Log.i("RG", "bitmap--->>>h" + bitmap.getHeight());
						Log.i("RG", "bitmap--->>>W" + bitmap.getWidth());
						Log.i("RG", "tmL--->>>W" + tmL);
						Log.i("RG", "tmT--->>>W" + tmT);
						Log.i("RG", "tmR--->>>W" + tmR);
						Log.i("RG", "tmB--->>>W" + tmB);
						bitmapOld = Bitmap.createBitmap(bitmap, tmL, tmT, tmR
								- tmL, tmB - tmT, null, true);
					} else {
						bitmapOld = null;

						bitmapOld = Bitmap.createBitmap(bitmap, tmL, tmT, tmR
								- tmL, tmB - tmT, null, true);
					}
				}
			}
		case MotionEvent.ACTION_MOVE:
			temp[0] = (int) event.getX();
			temp[1] = (int) event.getY();
			if (mFlag) {
				if (xy[0] == temp[0] && xy[1] == temp[1]) {

				} else {
					mFlagM = true;
					l = temp[0];
					t = temp[1];

					if (tuodongH > 0) {
						r = l + tuodongW;
						b = t + tuodongH;
					} else {
						r = l + 80;
						b = t + 80;
					}
					invalidate();
				}
			}
			if (mFlag1) {
				Log.i("RG", "panduanl you wentil ---->>>" + xy[0] + ",,,,"
						+ xy[1]);
				if (temp[0] > xy[0] || temp[1] < xy[1]) {
					Log.i("RG", "-------mFlag1------>>>>>>" + temp[0] + ",,,,"
							+ temp[1]);
					mFlag2 = true;

					change += 5;
					// l = xy[0];
					// t = xy[1];
					tempM[0] = r = (l + 80) + change;
					tempM[1] = b = (t + 80) + change;
					invalidate();

				} else {
					change -= 5;
					tempM[0] = r = (l + 80) + change;
					tempM[1] = b = (t + 80) + change;
					invalidate();
				}
			}
		}
		return true;
	}

	int tuodongH;
	int tuodongW;

	int tmL;
	int tmT;
	int tmR;
	int tmB;

	public Bitmap getBitmap() {

		return bitmapOld;
	}

	public void Pcanvas(Canvas canvas) {
		Paint mPaint = new Paint();
		mPaint.setStyle(Style.STROKE);
		mPaint.setStrokeMiter(6);
		mPaint.setStrokeWidth(3);
		mPaint.setColor(Color.RED);

		canvas.drawRect(l, t, r, b, mPaint);
		tuodongH = b - t;
		tuodongW = r - l;
		Paint mPaint1 = new Paint();

		mPaint1.setColor(Color.BLACK);
		mPaint1.setAlpha(100);
		canvas.drawRect(0, 0, 480, t, mPaint1);// 1111
		canvas.drawRect(0, b, 480, 800, mPaint1);
		canvas.drawRect(0, t, l, b, mPaint1);
		canvas.drawRect(r, t, 480, b, mPaint1);
	}

	@Override
	protected void onDraw(Canvas canvas) {

		if (mFlag1 && mFlag2) {

			Pcanvas(canvas);
			// mFlag1 = false;
			// mFlag2 = false;
			return;
		}
		if (mFlag == true && mFlagM == true) {
			Paint mPaint = new Paint();
			mPaint.setStyle(Style.STROKE);
			mPaint.setStrokeMiter(6);
			mPaint.setStrokeWidth(3);
			mPaint.setColor(Color.RED);

			canvas.drawRect(l, t, r, b, mPaint);
			tmL = l;
			tmT = t;
			tmR = r;
			tmB = b;
			Paint mPaint1 = new Paint();

			mPaint1.setColor(Color.BLACK);
			mPaint1.setAlpha(100);
			canvas.drawRect(0, 0, 480, t, mPaint1);// 1111
			canvas.drawRect(0, b, 480, 800, mPaint1);
			canvas.drawRect(0, t, l, b, mPaint1);
			canvas.drawRect(r, t, 480, b, mPaint1);
			return;
		}
		if (kaishi) {
			Paint mPaint = new Paint();
			mPaint.setStyle(Style.STROKE);
			mPaint.setStrokeMiter(6);
			mPaint.setStrokeWidth(3);
			mPaint.setColor(Color.RED);

			canvas.drawRect(l, t, r, b, mPaint);
			Paint mPaint1 = new Paint();

			mPaint1.setColor(Color.BLACK);
			mPaint1.setAlpha(100);
			canvas.drawRect(0, 0, 480, t, mPaint1);// 1111
			canvas.drawRect(0, b, 480, 800, mPaint1);
			canvas.drawRect(0, t, l, b, mPaint1);
			canvas.drawRect(r, t, 480, b, mPaint1);
			kaishi = false;
		} else {
			return;
		}

		super.onDraw(canvas);
	}
}

下面是mainactivity类使用myview及监听事件:

package com.zte.caijian;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.support.v4.app.NavUtils;

public class MainActivity extends Activity implements OnClickListener {

	Button save;
	Button cencal;

	ImageView mImageView;
	ImageView mCaijian;
	myView my;
	Bitmap bitmap;
	LayoutParams lp = new LayoutParams(480, 600);

	@SuppressLint("NewApi")
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		init();
		bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.aa);
		my = new myView(MainActivity.this, bitmap);
		LinearLayout layout = new LinearLayout(MainActivity.this);

		layout.addView(my);
		layout.setTop(50);
		this.addContentView(layout, lp);

	}

	private void init() {
		save = (Button) findViewById(R.id.save);
		cencal = (Button) findViewById(R.id.cencal);
		mImageView = (ImageView) findViewById(R.id.imageview);
		mCaijian = (ImageView) findViewById(R.id.caijian);
		save.setOnClickListener(this);
		cencal.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.save:
			Log.i("RG", "CLICK-----");
			Bitmap bitmap = my.getBitmap();
			mImageView.setImageBitmap(bitmap);
			break;
		case R.id.cencal:
			MainActivity.this.finish();
			break;
		}

	}

}

xml布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <ImageView
        android:id="@+id/imageview"
        android:layout_width="480dip"
        android:layout_height="360dip"
        android:background="@drawable/aa" />

    <Button
        android:id="@+id/save"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="400dip"
        android:text="save" />

    <Button
        android:id="@+id/cencal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginTop="400dip"
        android:text="cencal" />

    <ImageView
        android:id="@+id/caijian"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="400dip"
        android:layout_centerHorizontal="true"
 />

</RelativeLayout>

还有很多的地方不足...............如果有哪位该人能够给个简单的方法就好啊......,代码很看,可不要喷饭哦............

quot;,
  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,下面是一个实现圆形边框和图片裁剪自定义View的完整代码: ``` public class CircleImageView extends ImageView { private Paint mBorderPaint; private int mBorderColor; private int mBorderWidth; private Bitmap mBitmap; private BitmapShader mBitmapShader; private int mBitmapWidth; private int mBitmapHeight; private float mRadius; private RectF mBorderRect; public CircleImageView(Context context) { super(context); init(); } public CircleImageView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mBorderPaint = new Paint(); mBorderPaint.setAntiAlias(true); mBorderRect = new RectF(); } @Override protected void onDraw(Canvas canvas) { if (mBitmapShader == null) { mBitmap = getBitmap(); if (mBitmap != null) { mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); mBitmapWidth = mBitmap.getWidth(); mBitmapHeight = mBitmap.getHeight(); mRadius = Math.min(mBitmapWidth, mBitmapHeight) / 2; updateShaderMatrix(); } } if (mBitmapShader != null) { mBorderPaint.setShader(mBitmapShader); canvas.drawCircle(mRadius, mRadius, mRadius, mBorderPaint); mBorderPaint.setShader(null); mBorderPaint.setColor(mBorderColor); mBorderPaint.setStrokeWidth(mBorderWidth); mBorderRect.set(0, 0, getWidth(), getHeight()); canvas.drawArc(mBorderRect, 0, 360, false, mBorderPaint); } } private void updateShaderMatrix() { float scale; float dx = 0; float dy = 0; if (mBitmapWidth * getHeight() > getWidth() * mBitmapHeight) { scale = getHeight() / (float) mBitmapHeight; dx = (getWidth() - mBitmapWidth * scale) * 0.5f; } else { scale = getWidth() / (float) mBitmapWidth; dy = (getHeight() - mBitmapHeight * scale) * 0.5f; } Matrix matrix = new Matrix(); matrix.setScale(scale, scale); matrix.postTranslate((int) (dx + 0.5f), (int) (dy + 0.5f)); mBitmapShader.setLocalMatrix(matrix); } public void setBorderColor(int borderColor) { if (borderColor == mBorderColor) { return; } mBorderColor = borderColor; invalidate(); } public void setBorderWidth(int borderWidth) { if (borderWidth == mBorderWidth) { return; } mBorderWidth = borderWidth; invalidate(); } private Bitmap getBitmap() { Drawable drawable = getDrawable(); if (drawable == null) { return null; } if (drawable instanceof BitmapDrawable) { return ((BitmapDrawable) drawable).getBitmap(); } Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); return bitmap; } } ``` 使用方法: 在布局文件中添加自定义View: ``` <com.example.CircleImageView android:id="@+id/circle_image_view" android:layout_width="100dp" android:layout_height="100dp" android:src="@drawable/avatar" app:border_color="#ffffff" app:border_width="4dp" /> ``` 其中 `app:border_color` 和 `app:border_width` 分别表示边框的颜色和宽度,可以根据需要调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值