package com.hzq.picturedraganddropdemo;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Canvas;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.widget.TextView;
import com.hzq.picturedraganddropdemo.adapter.GridImageAdapter;
import java.util.ArrayList;
import java.util.Collections;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;
/**
* @author 小强
* @time 2020/4/20 09:00
* @desc 主页(演示图片拖拽)
*/
public class MainActivity extends AppCompatActivity implements GridImageAdapter.onAddPicClickListener {
private ItemTouchHelper mItemTouchHelper;
private DragListener mDragListener;
private boolean needScaleBig = true;
private boolean needScaleSmall = true;
private RecyclerView mRecyclerView;
private TextView mTvDeleteText;
private boolean isUpward;
private GridImageAdapter mAdapter;
private int maxSelectNum = 9;
public static final int RC_CHOOSE_PHOTO = 1;
ArrayList<String> strings = new ArrayList<>();
@Override
protected void onCreate (@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = findViewById(R.id.recycler);
mTvDeleteText = findViewById(R.id.tv_delete_text);
FullyGridLayoutManager manager = new FullyGridLayoutManager(this,
4, GridLayoutManager.VERTICAL, false);
mRecyclerView.setLayoutManager(manager);
mAdapter = new GridImageAdapter(this, this);
mAdapter.setList(strings);
mAdapter.setSelectMax(maxSelectNum);
mRecyclerView.setAdapter(mAdapter);
mAdapter.setItemLongClickListener((holder, position, v) -> {
//如果item不是最后一个,则执行拖拽
needScaleBig = true;
needScaleSmall = true;
int size = mAdapter.getData().size();
if (size != maxSelectNum) {
mItemTouchHelper.startDrag(holder);
return;
}
if (holder.getLayoutPosition() != size - 1) {
mItemTouchHelper.startDrag(holder);
}
});
mDragListener = new DragListener() {
@Override
public void deleteState (boolean isDelete) {
if (isDelete) {
mTvDeleteText.setText("松手即可删除");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
mTvDeleteText.setCompoundDrawablesRelativeWithIntrinsicBounds(0, R.mipmap.icon_let_go_delete, 0, 0);
}
} else {
mTvDeleteText.setText("拖动到此处删除");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
mTvDeleteText.setCompoundDrawablesRelativeWithIntrinsicBounds(0, R.mipmap.picture_icon_delete, 0, 0);
}
}
}
@Override
public void dragState (boolean isStart) {
int visibility = mTvDeleteText.getVisibility();
if (isStart) {
if (visibility == View.GONE) {
mTvDeleteText.animate().alpha(1).setDuration(300).setInterpolator(new AccelerateInterpolator());
mTvDeleteText.setVisibility(View.VISIBLE);
}
} else {
if (visibility == View.VISIBLE) {
mTvDeleteText.animate().alpha(0).setDuration(300).setInterpolator(new AccelerateInterpolator());
mTvDeleteText.setVisibility(View.GONE);
}
}
}
};
mItemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
@Override
public boolean isLongPressDragEnabled () {
return true;
}
@Override
public void onSwiped (@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
}
@Override
public int getMovementFlags (@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
int itemViewType = viewHolder.getItemViewType();
if (itemViewType != GridImageAdapter.TYPE_CAMERA) {
viewHolder.itemView.setAlpha(0.7f);
}
return makeMovementFlags(ItemTouchHelper.DOWN | ItemTouchHelper.UP
| ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT, 0);
}
@Override
public boolean onMove (@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
//得到item原来的position
try {
int fromPosition = viewHolder.getAdapterPosition();
//得到目标position
int toPosition = target.getAdapterPosition();
int itemViewType = target.getItemViewType();
if (itemViewType != GridImageAdapter.TYPE_CAMERA) {
if (fromPosition < toPosition) {
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(mAdapter.getData(), i, i + 1);
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(mAdapter.getData(), i, i - 1);
}
}
mAdapter.notifyItemMoved(fromPosition, toPosition);
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
@Override
public void onChildDraw (@NonNull Canvas c, @NonNull RecyclerView recyclerView,
@NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
int itemViewType = viewHolder.getItemViewType();
if (itemViewType != GridImageAdapter.TYPE_CAMERA) {
if (null == mDragListener) {
return;
}
if (needScaleBig) {
//如果需要执行放大动画
viewHolder.itemView.animate().scaleXBy(0.1f).scaleYBy(0.1f).setDuration(100);
//执行完成放大动画,标记改掉
needScaleBig = false;
//默认不需要执行缩小动画,当执行完成放大 并且松手后才允许执行
needScaleSmall = false;
}
int sh = recyclerView.getHeight() + mTvDeleteText.getHeight();
int ry = mTvDeleteText.getTop() - sh;
if (dY >= ry) {
//拖到删除处
mDragLis
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
图片拖拽演示.zip (44个子文件)
PictureDragAndDropDemo
gradlew 5KB
settings.gradle 16B
gradle
wrapper
gradle-wrapper.properties 238B
gradle-wrapper.jar 53KB
local.properties 383B
gradlew.bat 2KB
gradle.properties 1KB
.gitignore 216B
app
src
androidTest
java
com
hzq
picturedraganddropdemo
ExampleInstrumentedTest.java 762B
test
java
com
hzq
picturedraganddropdemo
ExampleUnitTest.java 408B
main
AndroidManifest.xml 1KB
res
mipmap-hdpi
ic_launcher.png 3KB
ic_launcher_round.png 5KB
mipmap-xxxhdpi
ic_launcher.png 9KB
ic_launcher_round.png 15KB
mipmap-xhdpi
ic_launcher.png 4KB
icon_let_go_delete.png 1KB
picture_icon_delete.png 1KB
icon_add_image.png 897B
icon_delete_menu.png 1KB
ic_launcher_round.png 7KB
icon_production.png 544B
mipmap-anydpi-v26
ic_launcher.xml 274B
ic_launcher_round.xml 274B
mipmap-mdpi
ic_launcher.png 2KB
ic_launcher_round.png 3KB
drawable
ic_launcher_background.xml 6KB
layout
item_grid_filter_image.xml 1KB
activity_main.xml 1KB
drawable-v24
ic_launcher_foreground.xml 2KB
values
colors.xml 260B
strings.xml 88B
styles.xml 392B
mipmap-xxhdpi
ic_launcher.png 6KB
ic_launcher_round.png 10KB
java
com
hzq
picturedraganddropdemo
FullyGridLayoutManager.java 4KB
MainActivity.java 13KB
adapter
GridImageAdapter.java 6KB
FileUtil.java 6KB
libs
.gitignore 8B
build.gradle 1KB
proguard-rules.pro 772B
PictureDragAndDropDemo.iml 894B
build.gradle 585B
共 44 条
- 1
资源评论
敲代码的小强
- 粉丝: 41
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- tesseract安装包
- 1_32陀螺仪舵机.zip
- HITJ0302MP-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- XILINXFPGA源码PCIExpress标准概述
- HITJ0204MP-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- XILINXFPGA源码PCIExpressIP核应用参考设计
- XILINXFPGA源码LCD12864在Spartan-3E实现代码
- XILINXFPGA源码LCDIPCORE
- G6402-VB一款SOT23封装P-Channel场效应MOS管
- XILINXFPGA源码IPcamera的开源系统
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功