android实现拖拽裁剪功能
作者:hu5080126 发布时间:2022-03-10 09:37:14
标签:android,拖拽,裁剪
本文实例为大家分享了android拖拽框,裁剪出图片的具体代码,供大家参考,具体内容如下
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import eebochina.com.testsomething.R;
public class DragTakePhoto extends AppCompatActivity implements View.OnTouchListener {
ImageView takePhoto;
ImageView takeImage;
Button mButton;
static final String tag = "takePhoto";
RelativeLayout.LayoutParams mLayoutParams;
int left, top, bottom, right;
int x, y;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drag_take_photo);
takePhoto = (ImageView) findViewById(R.id.take_layout);
takeImage = (ImageView) findViewById(R.id.take_image);
mButton = (Button) findViewById(R.id.take_crop);
takePhoto.setOnTouchListener(this);
takePhoto.post(new Runnable() {
@Override
public void run() {
Log.d(tag, "" + takePhoto.getX() + " ," + takePhoto.getY() + " :" + takePhoto.getPivotX() + " " + takePhoto.getPivotY());
}
});
mLayoutParams = (RelativeLayout.LayoutParams) takePhoto.getLayoutParams();
final Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.take);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
float wd = (bitmap.getWidth() * 10000 / takeImage.getWidth()) / 10000f;
float hd = (bitmap.getHeight() * 10000 / takeImage.getHeight()) / 10000f;
Bitmap bitmap1 = Bitmap.createBitmap(bitmap, (int) (takePhoto.getX() * wd), (int) (takePhoto.getY() * hd), (int) (takePhoto.getWidth() * wd), (int) (takePhoto.getHeight() * hd));
takePhoto.setImageBitmap(bitmap1);
}
});
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) takeImage.getLayoutParams();
left = layoutParams.leftMargin;
top = layoutParams.topMargin;
right = takeImage.getWidth() - left - takePhoto.getWidth();
bottom = takeImage.getHeight() - top - takePhoto.getHeight();
}
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
x = (int) motionEvent.getRawX() - mLayoutParams.leftMargin;
y = (int) motionEvent.getRawY() - mLayoutParams.topMargin;
break;
case MotionEvent.ACTION_MOVE:
int movex = (int) (motionEvent.getRawX() - x);
int movey = (int) (motionEvent.getRawY() - y);
Log.d(tag, "x:" + movex + " y:" + movey);
if (movex < left) movex = left;
if (movey < top) movey = top;
if (movex > right) movex = right;
if (movey > bottom) movey = bottom;
mLayoutParams.leftMargin = movex;
mLayoutParams.topMargin = movey;
takePhoto.setLayoutParams(mLayoutParams);
break;
}
takePhoto.invalidate();
return true;
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="eebochina.com.testsomething.dragTake.DragTakePhoto">
<ImageView
android:id="@+id/take_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/take"
android:layout_marginBottom="50dp"
/>
<ImageView
android:id="@+id/take_layout"
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:background="@android:color/holo_blue_dark"
/>
<Button
android:id="@+id/take_crop"
android:layout_width="200dp"
android:layout_height="40dp"
android:background="@android:color/holo_blue_dark"
android:text="裁剪"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
/>
</RelativeLayout>
来源:https://blog.csdn.net/hu5080126/article/details/52515481
0
投稿
猜你喜欢
- 在使用jQuery时候,我们经常会看到或者使用到方法链,例如:$("#p1").css("color"
- 引言 在c#中,可能大多数人针对于多线程之间的通讯,是熟能生巧,对于AsyncLocal 和Thre
- 开发Android程序时,有时候在程序运行的时候,不能让系统休眠,否则有一些运行会停止,因此我们需要设置禁止休眠,有两种方式: &
- KMP算法是一种神奇的字符串匹配算法,在对 超长字符串 进行模板匹配的时候比暴力匹配法的效率会高不少。接下来我们从思路入手理解KMP算法。在
- 引言♀ 小AD:明哥,我终于出了这口恶气了。♂ 明世隐:打爽了是吧。♀ 小AD:那必须的,打十盘我赢九盘,我随意。♂ 明世隐:那小朋友不是搞
- 图形验证码属于老生常谈了,具体细节这里就不说了。生成图形验证码的办法非常多,今天讲解一种通过Kaptcha组件快速生成图形验证码的方法。Ka
- 通过spring注解开发,测试单例和多例区别1.注解和配置两种用法形式配置版:注解版:2.在spring框架中,scope作用域默认是单例的
- 前言:在纯 Java 代码里 我们一般都会用class.getResource(String name) 或者 class.getClass
- 1. JAVA 内存模型 (JMM)JMM是用来干嘛的?:《Java虚拟机规范》中曾试图定义一种“Java内存模型&am
- 本文为大家分析了Java中字符流与字节流的区别,供大家参考,具体内容如下1. 什么是流 Java中的流是
- 本文实例为大家分享了unity实现手游虚拟摇杆的具体代码,供大家参考,具体内容如下using System.Collections;usin
- 在上一节中,我带大家学习了详解SpringBoot集成Redis来实现缓存技术方案,尤其是结合Spring Cache的注解的实现方案,接下
- 为避免繁琐的注册登陆,很多平台和网站都会实现三方登陆的功能,增强用户的粘性。这篇文章主要介绍了java实现微信扫码登录第三方网站功能(原理和
- 定义Builder模式是一步步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构建过程。该模式是
- 以下是SpringBoot项目中的常用配置类、jar包坐标等通用配置pom文件<!-- --><!-- 自定义配置文件
- 本文实例为大家分享了Java工具类DateUtils的具体代码,供大家参考,具体内容如下import java.text.ParseExce
- 如下所示:using System;using System.Collections.Generic;using System.Text;n
- public void CutToF(Stream stream)
- Purpose开发人员在合作的时候经常遇到以下场景:1.开发人员A在自己的本地数据库做了一些表结构的改动,并根据这些改动调整了DAO层的代码
- SpringBoot是什么?Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初