设为首页 加入收藏

TOP

Android 自定义控件——图片剪裁(四)
2015-02-02 14:32:00 来源: 作者: 【 】 浏览:54
Tags:Android 定义 控件 图片 剪裁
tBounds(mDrawableDst);
? mFloatDrawable.setBounds(mDrawableFloat);
?}


?// 在up事件中调用了该方法,目的是检查是否把浮层拖出了屏幕
?protected void checkBounds() {
? int newLeft = mDrawableFloat.left;
? int newTop = mDrawableFloat.top;


? boolean isChange = false;
? if (mDrawableFloat.left < getLeft()) {
? ?newLeft = getLeft();
? ?isChange = true;
? }


? if (mDrawableFloat.top < getTop()) {
? ?newTop = getTop();
? ?isChange = true;
? }


? if (mDrawableFloat.right > getRight()) {
? ?newLeft = getRight() - mDrawableFloat.width();
? ?isChange = true;
? }


? if (mDrawableFloat.bottom > getBottom()) {
? ?newTop = getBottom() - mDrawableFloat.height();
? ?isChange = true;
? }


? mDrawableFloat.offsetTo(newLeft, newTop);
? if (isChange) {
? ?invalidate();
? }
?}


?// 进行图片的裁剪,所谓的裁剪就是根据Drawable的新的坐标在画布上创建一张新的图片
?public Bitmap getCropImage() {
? Bitmap tmpBitmap = Bitmap.createBitmap(getWidth(), getHeight(),
? ? Config.RGB_565);
? Canvas canvas = new Canvas(tmpBitmap);
? mDrawable.draw(canvas);


? Matrix matrix = new Matrix();
? float scale = (float) (mDrawableSrc.width())
? ? / (float) (mDrawableDst.width());
? matrix.postScale(scale, scale);


? Bitmap ret = Bitmap.createBitmap(tmpBitmap, mDrawableFloat.left,
? ? mDrawableFloat.top, mDrawableFloat.width(),
? ? mDrawableFloat.height(), matrix, true);
? tmpBitmap.recycle();
? tmpBitmap = null;


? return ret;
?}


?public int dipTopx(Context context, float dpValue) {
? final float scale = context.getResources().getDisplayMetrics().density;
? return (int) (dpValue * scale + 0.5f);
?}
}


FloatDrawable.java


继承自Drawable


功能:图片上面的浮动框,通过拖动确定位置


public class FloatDrawable extends Drawable {


?private Context mContext;
?private int offset = 50;
?private Paint mLinePaint = new Paint();
?private Paint mLinePaint2 = new Paint();
?{
? mLinePaint.setARGB(200, 50, 50, 50);
? mLinePaint.setStrokeWidth(1F);
? mLinePaint.setStyle(Paint.Style.STROKE);
? mLinePaint.setAntiAlias(true);
? mLinePaint.setColor(Color.WHITE);
? //
? mLinePaint2.setARGB(200, 50, 50, 50);
? mLinePaint2.setStrokeWidth(7F);
? mLinePaint2.setStyle(Paint.Style.STROKE);
? mLinePaint2.setAntiAlias(true);
? mLinePaint2.setColor(Color.WHITE);
?}


?public FloatDrawable(Context context) {
? super();
? this.mContext = context;


?}


?public int getBorderWidth() {
? return dipTopx(mContext, offset);//根据dip计算的像素值,做适配用的
?}


?public int getBorderHeight() {
? return dipTopx(mContext, offset);
?}


?@Override
?public void draw(Canvas canvas) {


? int left = getBounds().left;
? int top = getBounds().top;
? int right = getBounds().right;
? int bottom = getBounds().bottom;


? Rect mRect = new Rect(left + dipTopx(mContext, offset) / 2, top
? ? + dipTopx(mContext, offset) / 2, right
? ? - dipTopx(mContext, offset) / 2, bottom
? ? - dipTopx(mContext, offset) / 2);
? //画默认的选择框
? canvas.drawRect(mRect, mLinePaint);
? //画四个角的四个粗拐角、也就是八条粗线
? canvas.drawLine((left + dipTopx(mContext, offset) / 2 - 3.5f), top
? ? + dipTopx(mContext, offset) / 2,
? ? left + dipTopx(mContext, offset) - 8f,
? ? top + dipTopx(mContext, offset) / 2, mLinePaint2);
? canvas.drawLine(left + dipTopx(mContext, offset) / 2,
? ? top + dipTopx(mContext, offset) / 2,
? ? left + dipTopx(mContext, offset) / 2,
? ? top + dipTopx(mContext, offset) / 2 + 30, mLinePaint2);
? canvas.drawLine(right - dipTopx(mContext, offset) + 8f,
? ? top + dipTopx(mContext, offset) / 2,
? ? right - dipTopx(mContext, offset) / 2,
? ? top + dipTopx(mContext, offset) / 2, mLinePaint2);
? canvas.drawLine(right - dipTopx(mContext, offset) / 2,
? ? top + dipTopx(mCon

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android 图片拖拽、放大缩小的自.. 下一篇Android ContentObserver使用实现..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: