最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android 仿微信發(fā)動(dòng)態(tài)九宮格拖拽、刪除功能

 更新時(shí)間:2019年11月18日 11:28:07   作者:INTKILOW  
這篇文章主要介紹了Android 仿微信發(fā)動(dòng)態(tài)九宮格拖拽、刪除功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1、完美1比1 仿照微信仿微信發(fā)動(dòng)態(tài) 九宮格拖拽、刪除

暴力拖拽ui有點(diǎn)問題,不影響使用,資源文件自己找個(gè)+號(hào)

2、微信發(fā)動(dòng)態(tài)拖拽bug

當(dāng)選擇完圖片,長(zhǎng)按圖片拖拽過程中按下屏幕home鍵盤,再次進(jìn)入這時(shí)候就不能點(diǎn)擊輸入文字,點(diǎn)擊輸入文字的時(shí)候會(huì)觸發(fā)選擇相冊(cè)事件

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、演示

在這里插入圖片描述

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);//自己對(duì)一下高度
 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、實(shí)現(xiàn)過程

如果幫助到你請(qǐng)關(guān)注點(diǎn)贊一下

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);//加號(hào)
  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的長(zhǎng)度等于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);
 }
 }
 /**
 * 拖拽監(jiān)聽
 */
 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) {
  //空閑狀態(tài)
  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;
 }
 /**
 * 底部進(jìn)入
 */
 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>

總結(jié)

以上所述是小編給大家介紹的Android 仿微信發(fā)動(dòng)態(tài)九宮格拖拽、刪除功能,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • android雙緩沖技術(shù)實(shí)例詳解

    android雙緩沖技術(shù)實(shí)例詳解

    這篇文章主要介紹了android雙緩沖技術(shù)實(shí)例詳解,需要的朋友可以參考下
    2014-07-07
  • Android?Service啟動(dòng)流程刨析

    Android?Service啟動(dòng)流程刨析

    這幾天分析了一下的啟動(dòng)過程,于是乎,今天寫一下Service是如何啟動(dòng)的;?給我的感覺是這些啟動(dòng)過程并不復(fù)雜,千萬不要被一坨一坨的代碼嚇住了,雖然彎彎繞繞不少,重載函數(shù)一個(gè)接著一個(gè),就向走迷宮一樣,但只要抓住主線閱讀,很快就能找到出口
    2022-08-08
  • Android仿滴滴出行驗(yàn)證碼輸入框功能實(shí)例代碼

    Android仿滴滴出行驗(yàn)證碼輸入框功能實(shí)例代碼

    最近項(xiàng)目經(jīng)理交給我們組一個(gè)類似滴滴出行填寫驗(yàn)證碼的彈框功能,拿到這個(gè)項(xiàng)目需求真是把我忙暈了,下面通過本文給大家分享Android仿滴滴出行驗(yàn)證碼輸入框功能實(shí)例代碼,需要的朋友參考下吧
    2017-12-12
  • Flutter生命周期超詳細(xì)講解

    Flutter生命周期超詳細(xì)講解

    和其他的視圖框架比如android的Activity一樣,flutter中的視圖Widget也存在生命周期,生命周期的回調(diào)函數(shù)提現(xiàn)在了State上面。理解flutter的生命周期,對(duì)我們寫出一個(gè)合理的控件至關(guān)重要
    2023-04-04
  • Android更新UI的四種方法詳解

    Android更新UI的四種方法詳解

    大家都知道由于性能要求,android要求只能在UI線程中更新UI,要想在其他線程中更新UI,我大致總結(jié)了4種方式,有需要的朋友們可以參考借鑒。
    2016-09-09
  • Android開發(fā)之DiffUtil的使用詳解

    Android開發(fā)之DiffUtil的使用詳解

    這篇文章文給大家介紹了DiffUtil的使用,相信大家每位Android開發(fā)者們都知道谷歌最近更新了Support Library 24.2.0,而DiffUtil就是在這個(gè)版本添加的一個(gè)工具類。下面就跟著小編一起來看看,有需要的可以參考借鑒。
    2016-09-09
  • Android編程實(shí)現(xiàn)仿QQ發(fā)表說說,上傳照片及彈出框效果【附demo源碼下載】

    Android編程實(shí)現(xiàn)仿QQ發(fā)表說說,上傳照片及彈出框效果【附demo源碼下載】

    這篇文章主要介紹了Android編程實(shí)現(xiàn)仿QQ發(fā)表說說,上傳照片及彈出框效果,涉及Android動(dòng)畫特效的相關(guān)實(shí)現(xiàn)技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下
    2017-01-01
  • Android基于ViewDragHelper仿QQ5.0側(cè)滑界面效果

    Android基于ViewDragHelper仿QQ5.0側(cè)滑界面效果

    這篇文章主要介紹了Android基于ViewDragHelper仿QQ5.0側(cè)滑界面效果,具有一定的,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Android Webview滑進(jìn)出屏幕閃爍的解決方法

    Android Webview滑進(jìn)出屏幕閃爍的解決方法

    這篇文章主要給大家介紹了關(guān)于Android Webview滑進(jìn)出屏幕閃爍的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Android實(shí)現(xiàn)文字上下滾動(dòng)效果

    Android實(shí)現(xiàn)文字上下滾動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)文字上下滾動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12

最新評(píng)論

夏河县| 新密市| 和静县| 汉中市| 滕州市| 手游| 温州市| 贵州省| 泸水县| 靖远县| 宿迁市| 壶关县| 克拉玛依市| 九台市| 上饶市| 大安市| 集安市| 安国市| 日土县| 兴文县| 云霄县| 历史| 平定县| 大姚县| 天台县| 贺州市| 凤凰县| 新疆| 靖江市| 西林县| 微山县| 卢湾区| 沙坪坝区| 本溪市| 九江县| 什邡市| 南涧| 垫江县| 深水埗区| 阿荣旗| 嘉善县|