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


猜你喜欢
- 一、技术介绍1.chatgpt-java是一个OpenAI的Java版SDK,支持开箱即用。目前以支持官网全部Api。支持最新版本GPT-3
- 本文实例为大家分享了C# GDI+实现时钟表盘的具体代码,供大家参考,具体内容如下一、设计如下图界面按键“打开时钟&am
- 在 MyEclipse 的可视化 Swing 中,有 JTable 控件。JTable 用来显示和编辑常规二维单元表。那么,如何将 数据库S
- c#创建圆形类,其中包括set,get方法using System;using System.Collections.Generic;usi
- 前言我昨天做了个梦,我梦见我在一条路走,走的时候经过一个房间,里面关着一条边牧和鸡和猪,后来我醒了,我知道那只边牧就是小叶子(哈仔十一的边牧
- Android中Toolbar随着ScrollView滑动透明度渐变效果实现一.思路:监听ScrollView的滑动事件 不断的修改Tool
- 一、前言学习概述:学习四种不同类型的方法应用、方法被调用时的内存图、重载学习目标:熟练掌握方法的应用以及重载二、定义与调用1.概述定义:方法
- Java中可以使用关键字synchronized进行线程同步控制,实现关键资源顺序访问,避免由于多线程并发执行导致的数据不一致性等问题。sy
- 问题原因今天在看集合源码的时候,突然看到接口继承接口,觉得有点差异,以前写代码也就是类继承一个类,实现接口。这样写的多了,突然看到接口继承接
- ——声明,脑残人士远离,本博客的核心不是if-else+前缀,而是如何通过URL协议处理框架定义私有协议URI与URL的区别URI (uni
- 大家都知道在C#里面,我们可以使用Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来
- 0x00 前言在一些比较极端情况下,C3P0链的使用还是挺频繁的。0x01 利用方式利用方式在C3P0中有三种利用方式http baseJN
- Java实现Dijkstra输出指定起点到终点的最短路径前言:最近在公司参加了一个比赛,其中涉及的一个问题,可以简化成如是描述:一个二维矩阵
- 前言本节将介绍如何设置和使用MongoDB 驱动程序,通过 java实现与MongoDB服务端的通信功能,用户可以在此基础上进行各种Java
- 前言代码库:https://gitee.com/leo825/springboot-learning-parents.git之前写过《Spr
- 题目:求1+2!+3!+...+20!的和程序分析:此程序只是把累加变成了累乘。程序设计:public class Ex21 {  
- ActiveMQ 结合 Spring 收发消息直接使用 ActiveMQ 的方式需要重复写很多代码,且不利于管理,Spring 提供了一种更
- 初学线程时,总是将 run 方法和 start 方法搞混,虽然二者是完全不同的两个方法,但刚开始使用时很难分清,原因就是因为初次使用时效果貌
- 使用Zenject和UniRx的入门级技术实现了伪登录注册功能。运行效果登录面板using System;using UniRx;using
- 一、在drawable下面添加xml文件rounded_editview.xml<?xml version="1.0&quo