android实现拖拽裁剪功能

 更新时间:2022年05月18日 14:38:52   作者:hu5080126  
这篇文章主要为大家详细介绍了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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android convinientbanner顶部广告轮播控件使用详解

    Android convinientbanner顶部广告轮播控件使用详解

    这篇文章主要为大家详细介绍了Android convinientbanner顶部广告轮播控件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Android LayoutParams使用案例详解

    Android LayoutParams使用案例详解

    这篇文章主要介绍了Android LayoutParams使用案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Android中的Intent对象完全解析

    Android中的Intent对象完全解析

    这篇文章主要介绍了Android中的Intent对象,深入讲解了intent对象传递消息的各种用法,需要的朋友可以参考下
    2016-04-04
  • Android应用中实现选择本地文件与目录的实例分享

    Android应用中实现选择本地文件与目录的实例分享

    这篇文章主要介绍了Android应用中实现选择本地文件与目录的实例分享,相当于从app内呼出的简易的资源管理器来使用本地资源,需要的朋友可以参考下
    2016-02-02
  • android控制密码显示与隐藏的方法

    android控制密码显示与隐藏的方法

    这篇文章主要为大家详细介绍了android控制密码显示与隐藏的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Android三种网络通讯方式及Android的网络通讯机制

    Android三种网络通讯方式及Android的网络通讯机制

    在android平台目前提供了三种网络接口可以使用:分别是java.net.*(标准Java接口)、Org.apache接口和Android.net.*(Android网络接口),本文主要给大家介绍android三种网络通讯方式及android的网络通讯机制,小伙伴们一起学习吧
    2015-11-11
  • Android中实现图文并茂的按钮实例代码

    Android中实现图文并茂的按钮实例代码

    这篇文章主要介绍了Android中实现图文并茂的按钮实例代码,代码简单易懂,非常不错,需要的朋友可以参考下
    2017-04-04
  • 详解Kotlin协程的异常处理机制

    详解Kotlin协程的异常处理机制

    协程会遇到各种异常情况,比如协程被取消、协程内部发生错误、协程之间的异常传播等,这些异常情况需要我们正确地处理,否则可能会导致程序崩溃、资源泄露或者逻辑错误,本文将介绍 Kotlin 协程的异常处理机制,需要的朋友可以参考下
    2023-09-09
  • Android实现给TableLayou绘制边框的方法

    Android实现给TableLayou绘制边框的方法

    这篇文章主要介绍了Android实现给TableLayou绘制边框的方法,涉及Android TableLayou布局控制相关技巧,需要的朋友可以参考下
    2016-03-03
  • 详解Android .9.png “点九”图片的使用

    详解Android .9.png “点九”图片的使用

    这篇文章主要为大家详细介绍了Android .9.png “点九”图片的使用方法,感兴趣的小伙伴们可以参考一下
    2016-09-09

最新评论