欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 仿微信发动态九宫格拖拽、删除功能

程序员文章站 2023-11-23 21:54:16
1、完美1比1 仿照微信仿微信发动态 九宫格拖拽、删除 暴力拖拽ui有点问题,不影响使用,资源文件自己找个+号 2、微信发动态拖拽bug 当选择完图片,长按图片拖拽过程中按下屏幕...

1、完美1比1 仿照微信仿微信发动态 九宫格拖拽、删除

暴力拖拽ui有点问题,不影响使用,资源文件自己找个+号

2、微信发动态拖拽bug

当选择完图片,长按图片拖拽过程中按下屏幕home键盘,再次进入这时候就不能点击输入文字,点击输入文字的时候会触发选择相册事件

3、拖拽事件用的basequickadapter

 implementation 'com.android.support:recyclerview-v7:28.0.0'
 implementation "com.github.cymchad:baserecyclerviewadapterhelper:2.9.50"
 implementation "com.github.bumptech.glide:glide:4.9.0"

4、演示

Android 仿微信发动态九宫格拖拽、删除功能

5、快速入手

activity
 ninegridchooseimage ninegridchooseimage = findviewbyid(r.id.ninegridchooseimage);
 framelayout framelayout= findviewbyid(r.id.framelayout);
 ninegridchooseimage.init(framelayout);

 int statusbarheight = 0;
 int resourceid = getresources().getidentifier("status_bar_height", "dimen", "android");
 if (resourceid > 0) {
  statusbarheight = getresources().getdimensionpixelsize(resourceid);
 }
 ninegridchooseimage.setfixh(statusbarheight);//自己对一下高度
 ninegridchooseimage.setaddclick(new ninegridchooseimage.addclick() {
  @override
  public void onadd() {
  /* list<string> list = new linkedlist<>();
  for(int i = 0;i<5;i++){
   list.add("https://xx.jpg");
  }*/
  ninegridchooseimage.adddata("https://xxx.jpg");
  }
 });

xml

<?xml version="1.0" encoding="utf-8"?>
<framelayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/framelayout"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context=".main11activity">
 <com.example.hotfix_01.view.ninegridchooseimage
 android:background="#a8a1a1"
 android:layout_margintop="100dp"
 android:id="@+id/ninegridchooseimage"
 android:layout_width="match_parent"
 android:layout_height="wrap_content" />
</framelayout>

5、实现过程

如果帮助到你请关注点赞一下

ninegridchooseimage.java
package com.example.hotfix_01.view;
import android.animation.animator;
import android.animation.animatorlisteneradapter;
import android.animation.objectanimator;
import android.app.activity;
import android.content.context;
import android.graphics.canvas;
import android.graphics.color;
import android.graphics.point;
import android.graphics.rect;
import android.support.annotation.nonnull;
import android.support.annotation.nullable;
import android.support.v7.widget.gridlayoutmanager;
import android.support.v7.widget.recyclerview;
import android.support.v7.widget.helper.itemtouchhelper;
import android.text.textutils;
import android.util.attributeset;
import android.util.log;
import android.view.display;
import android.view.gravity;
import android.view.view;
import android.view.viewgroup;
import android.widget.framelayout;
import android.widget.imageview;
import android.widget.linearlayout;
import android.widget.textview;
import com.bumptech.glide.glide;
import com.chad.library.adapter.base.baseitemdraggableadapter;
import com.chad.library.adapter.base.baseviewholder;
import com.chad.library.adapter.base.callback.itemdragandswipecallback;
import com.chad.library.adapter.base.listener.onitemdraglistener;
import java.util.linkedlist;
import java.util.list;
import top.antaikeji.base.r;
import top.antaikeji.foundation.utils.displayutil;
import static android.support.v7.widget.helper.itemtouchhelper.action_state_idle;
/**
 * author: flyzhang
 */
public class ninegridchooseimage extends recyclerview {
 private rect lastrect = new rect();
 private rect rect = new rect();
 private boolean isdel = false, tempimagedel = false;
 private int mselectposition = 0;
 private int screen_w, screen_h;
 private int mimagewh;
 private int mimagecount = 4;
 private draggableadapter mdraggableadapter;
 private linearlayout mbottomview;
 private framelayout mframelayout;
 private addclick maddclick;
 private dragcallback mdragcallback;
 private imageview mtempimage;
 ;
 private int mfixh = 0;
 private int bottomviewh = 55;
 private imageview trash;
 private int margin = 2;
 public ninegridchooseimage(@nonnull context context) {
 super(context);
 }
 public ninegridchooseimage(@nonnull context context, @nullable attributeset attrs) {
 super(context, attrs);
 }
 public void init(framelayout f) {
 this.mframelayout = f;
 display defaultdisplay = ((activity) getcontext()).getwindowmanager().getdefaultdisplay();
 point point = new point();
 defaultdisplay.getsize(point);
 screen_h = point.y;
 screen_w = point.x;
 mimagewh = screen_w / 3 - 2 * displayutil.dptopx(5) - 4 * displayutil.pxtodp(20) - displayutil.pxtodp(50);
 bottomviewh = displayutil.dptopx(bottomviewh);
 margin = displayutil.dptopx(margin);
 mtempimage = new imageview(getcontext());
 mtempimage.setscaletype(imageview.scaletype.fit_xy);
 //初始化底部view
 mbottomview = new linearlayout(getcontext());
 mbottomview.setgravity(gravity.center);
 mbottomview.setbackgroundcolor(color.red);
 framelayout.layoutparams bottomlayoutparams = new framelayout.layoutparams(viewgroup.layoutparams.match_parent, bottomviewh);
 bottomlayoutparams.gravity = gravity.bottom;
 trash = new imageview(getcontext());
 int wh = displayutil.dptopx(25);
 framelayout.layoutparams trashparams = new framelayout.layoutparams(wh, wh);
 trash.setlayoutparams(trashparams);
 mbottomview.addview(trash);
 textview tiptextview = new textview(getcontext());
 tiptextview.settextcolor(color.white);
 tiptextview.settext("拖拽此处删除");
 mbottomview.addview(tiptextview);
 mbottomview.setorientation(linearlayout.vertical);
 mbottomview.setlayoutparams(bottomlayoutparams);
 mbottomview.setvisibility(gone);
 out();
 mframelayout.addview(mbottomview);
 gridlayoutmanager gridlayoutmanager = new gridlayoutmanager(getcontext(), 3);
 setlayoutmanager(gridlayoutmanager);
 list<string> data = new linkedlist<>();
 data.add("");
 mdraggableadapter = new draggableadapter(data);
 dragandswipecallback mitemdragandswipecallback = new dragandswipecallback(mdraggableadapter);
 itemtouchhelper itemtouchhelper = new itemtouchhelper(mitemdragandswipecallback);
 itemtouchhelper.attachtorecyclerview(this);
 mdraggableadapter.enabledragitem(itemtouchhelper, r.id.image, true);
 mitemdragandswipecallback.setswipemoveflags(itemtouchhelper.start | itemtouchhelper.end);
 mdraggableadapter.setonitemdraglistener(new onitemdraglistener() {
  @override
  public void onitemdragstart(recyclerview.viewholder viewholder, int pos) {
  if(null!=mdragcallback){
   mdragcallback.onstart();
  }
  mselectposition = pos;
  mframelayout.removeview(mtempimage);
  tempimagedel = false;
  isdel = false;
  in();
  imageview imageview = viewholder.itemview.findviewbyid(r.id.image);
  mtempimage.setimagedrawable(imageview.getdrawable());
  viewgroup.layoutparams l = new viewgroup.layoutparams(imageview.getwidth(), imageview.getheight());
  mtempimage.setlayoutparams(l);
  imageview.getglobalvisiblerect(lastrect);
  mtempimage.setx(lastrect.left);
  mtempimage.sety(lastrect.top - mfixh);
  mtempimage.setscalex(1.2f);
  mtempimage.setscaley(1.2f);
  mframelayout.addview(mtempimage);
  imageview.setalpha(0f);
  }
  @override
  public void onitemdragmoving(recyclerview.viewholder source, int from, recyclerview.viewholder target, int to) {
  target.itemview.findviewbyid(r.id.image).getglobalvisiblerect(lastrect);
  mselectposition = to;
  }
  @override
  public void onitemdragend(recyclerview.viewholder viewholder, int pos) {
  if(null!=mdragcallback){
   mdragcallback.onend();
  }
  imageview imageview = viewholder.itemview.findviewbyid(r.id.image);
  imageview.setscalex(1f);
  imageview.setscaley(1f);
  if (tempimagedel) {
   mdraggableadapter.remove(mselectposition);
  } else {
   imageview.setalpha(1f);
   mframelayout.removeview(mtempimage);
  }
  out();
  }
 });
 setadapter(mdraggableadapter);
 }
 public void setfixh(int mfixh) {
 this.mfixh = mfixh;
 }
 /**
 * 拖住adapter
 */
 private class draggableadapter extends baseitemdraggableadapter<string, baseviewholder> {
 private draggableadapter(list<string> data) {
  super(r.layout.base_iamge_item, data);
 }
 @override
 protected void convert(@nonnull baseviewholder helper, string item) {
  imageview imageview = helper.getview(r.id.image);//图片
  linearlayout.layoutparams l = (linearlayout.layoutparams) imageview.getlayoutparams();
  l.height = mimagewh;
  l.width = mimagewh;
  l.rightmargin = margin;
  l.bottommargin = margin;
  l.topmargin = margin;
  imageview.setlayoutparams(l);
  imageview imageview2 = helper.getview(r.id.image2);//加号
  linearlayout.layoutparams l2 = (linearlayout.layoutparams) imageview.getlayoutparams();
  l2.height = mimagewh;
  l2.width = mimagewh;
  l2.rightmargin = margin;
  l2.bottommargin = margin;
  l2.topmargin = margin;
  imageview2.setlayoutparams(l2);
  /**
  * 如果list的长度等于mimagecount 最后一张最后一张显示正常图片
  *
  */
  if(textutils.isempty(item)){
  if(mimagecount <= helper.getadapterposition()){
   imageview.setvisibility(view.gone);
   imageview2.setvisibility(view.gone);
  }else{
   imageview.setvisibility(view.gone);
   imageview2.setvisibility(view.visible);
   imageview2.setonclicklistener(new onclicklistener() {
   @override
   public void onclick(view v) {
    if (null != maddclick) {
    maddclick.onadd();
    }
   }
   });
  }
  }else{
  imageview.setvisibility(view.visible);
  imageview2.setvisibility(view.gone);
  glide.with(mcontext).load(item).into(imageview);
  }
  imageview.setalpha(1f);
 }
 }
 /**
 * 拖拽监听
 */
 private class dragandswipecallback extends itemdragandswipecallback {
 private dragandswipecallback(baseitemdraggableadapter adapter) {
  super(adapter);
 }
 @override
 public boolean candropover(@nonnull recyclerview recyclerview, @nonnull recyclerview.viewholder current, @nonnull recyclerview.viewholder target) {
  if (target.getadapterposition() == mdraggableadapter.getdata().size() - 1 || current.getadapterposition() == mdraggableadapter.getdata().size() - 1) {
  return false;
  }
  return super.candropover(recyclerview, current, target);
 }
 @override
 public void onselectedchanged(recyclerview.viewholder viewholder, int actionstate) {
  super.onselectedchanged(viewholder, actionstate);
  if (actionstate == action_state_idle) {
  //空闲状态
  if (isdel) {
   isdel = false;
   tempimagedel = true;
   mframelayout.removeview(mtempimage);
  }
  }
 }
 @override
 public void onchilddrawover(@nonnull canvas c, @nonnull recyclerview recyclerview, @nonnull recyclerview.viewholder viewholder, float dx, float dy, int actionstate, boolean iscurrentlyactive) {
  super.onchilddrawover(c, recyclerview, viewholder, dx, dy, actionstate, iscurrentlyactive);
  if (tempimagedel) {
  return;
  }
  imageview tempimageview = viewholder.itemview.findviewbyid(r.id.image);
  boolean b = tempimageview.getglobalvisiblerect(rect);
  log.e("tag", "dx:" + dx);
  log.e("tag", "dy:" + dy);
  if (b && dx > 0 && dy > 0) {
  mtempimage.setx(rect.left);
  mtempimage.sety(rect.top - mfixh);
  } else {
  mtempimage.setx(lastrect.left + dx);
  mtempimage.sety(lastrect.top - mfixh + dy);
  }
  mtempimage.getglobalvisiblerect(rect);
  if (screen_h - bottomviewh < rect.bottom) {
  isdel = true;
  trash.setbackgroundresource(r.drawable.base_trash_open);
  } else {
  isdel = false;
  trash.setbackgroundresource(r.drawable.base_trash_close);
  }
 }
 }
 public void adddata(string path) {
 mdraggableadapter.adddata(0, path);
 mdraggableadapter.notifyitemchanged(mdraggableadapter.getdata().size()-1);
 }
 public void adddata(list<string> path){
 int size = mdraggableadapter.getdata().size();
 int offset = mimagecount - size + 1;
 if(offset > path.size()){
  offset = path.size();
 }
 mdraggableadapter.adddata(0, path.sublist(0,offset));
 mdraggableadapter.notifyitemchanged(mdraggableadapter.getdata().size() -1);
 }
 public void setimagecount(int mimagecount) {
 this.mimagecount = mimagecount;
 }
 public void setaddclick(addclick maddclick) {
 this.maddclick = maddclick;
 }
 public void setdragcallback(dragcallback mdragcallback) {
 this.mdragcallback = mdragcallback;
 }
 /**
 * 获取列表
 *
 * @return
 */
 public list<string> getdata() {
 list<string> res = new linkedlist<>();
 for (int i = 0; i < mdraggableadapter.getdata().size() - 1; i++) {
  res.add(mdraggableadapter.getdata().get(i));
 }
 return res;
 }
 /**
 * 底部进入
 */
 private void in() {
 mbottomview.setvisibility(view.visible);
 objectanimator animator = objectanimator.offloat(mbottomview, "translationy", 0)
  .setduration(200);
 animator.start();
 }
 /**
 * 底部移除屏幕外部
 */
 private void out() {
 final int movex = displayutil.dptopx(55);
 objectanimator animator = objectanimator.offloat(mbottomview, "translationy", movex)
  .setduration(200);
 animator.addlistener(new animatorlisteneradapter() {
  @override
  public void onanimationend(animator animation) {
  super.onanimationend(animation);
  mbottomview.setvisibility(view.gone);
  trash.setbackgroundresource(r.drawable.base_trash_close);
  }
 });
 animator.start();
 }
 public interface addclick {
 void onadd();
 }
 public interface dragcallback{
 void onstart();
 void onend();
 }
}

iamge_item.xml

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/l"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" >

 <imageview
 android:scaletype="fitxy"
 android:id="@+id/image"
 android:layout_width="149dp"
 android:layout_height="149dp" />

 <imageview
 android:id="@+id/image2"
 android:visibility="gone"
 android:layout_width="149dp"
 android:layout_height="149dp" />
</linearlayout>

总结

以上所述是小编给大家介绍的android 仿微信发动态九宫格拖拽、删除功能,希望对大家有所帮助