欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

這篇文章將為大家詳細(xì)講解有關(guān)Android如何仿微信發(fā)動(dòng)態(tài)九宮格拖拽、刪除功能,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

我們注重客戶提出的每個(gè)要求,我們充分考慮每一個(gè)細(xì)節(jié),我們積極的做好成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站服務(wù),我們努力開拓更好的視野,通過不懈的努力,創(chuàng)新互聯(lián)公司贏得了業(yè)內(nèi)的良好聲譽(yù),這一切,也不斷的激勵(lì)著我們更好的服務(wù)客戶。 主要業(yè)務(wù):網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),小程序定制開發(fā),網(wǎng)站開發(fā),技術(shù)開發(fā)實(shí)力,DIV+CSS,PHP及ASP,ASP.Net,SQL數(shù)據(jù)庫(kù)的技術(shù)開發(fā)工程師。

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、快速入手

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("/upload/otherpic58/46599.jpg");  }*/  nineGridChooseImage.addData("/upload/otherpic58/46605.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.javapackage 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>

關(guān)于“Android如何仿微信發(fā)動(dòng)態(tài)九宮格拖拽、刪除功能”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

名稱欄目:Android如何仿微信發(fā)動(dòng)態(tài)九宮格拖拽、刪除功能
文章地址:http://chinadenli.net/article46/joiohg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站網(wǎng)站導(dǎo)航、微信小程序品牌網(wǎng)站制作、做網(wǎng)站標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
成年男女午夜久久久精品| 午夜小视频成人免费看| 男女一进一出午夜视频| 青草草在线视频免费视频| 欧美亚洲91在线视频| 成人精品欧美一级乱黄| 加勒比系列一区二区在线观看 | 一级片黄色一区二区三区| 九七人妻一区二区三区| 日韩在线一区中文字幕| 日本少妇aa特黄大片| 绝望的校花花间淫事2| 午夜激情视频一区二区| 久久91精品国产亚洲| 最近最新中文字幕免费| 日本一品道在线免费观看| 国产精品欧美一级免费| 亚洲中文字幕在线观看四区| 亚洲一区二区三区三州| 日韩女优视频国产一区| 国产又长又粗又爽免费视频| 亚洲熟妇中文字幕五十路| 日韩精品一区二区一牛| 日本加勒比中文在线观看| 成人亚洲国产精品一区不卡 | 国产精品一区二区视频大全| 亚洲国产91精品视频| 人体偷拍一区二区三区| 四季精品人妻av一区二区三区 | 欧美av人人妻av人人爽蜜桃 | 久久国产人妻一区二区免费| 国产精品一区二区三区日韩av| 激情五月综五月综合网| 欧美不雅视频午夜福利| 欧美日韩国内一区二区| 亚洲天堂久久精品成人| 国产盗摄精品一区二区视频| 欧美小黄片在线一级观看| 国产成人精品久久二区二区| 日本不卡在线视频你懂的| 亚洲专区一区中文字幕|