【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android怎么仿微信發(fā)動(dòng)態(tài)九宮格拖拽、刪除功能_第1頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android怎么仿微信發(fā)動(dòng)態(tài)九宮格拖拽、刪除功能_第2頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android怎么仿微信發(fā)動(dòng)態(tài)九宮格拖拽、刪除功能_第3頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android怎么仿微信發(fā)動(dòng)態(tài)九宮格拖拽、刪除功能_第4頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android怎么仿微信發(fā)動(dòng)態(tài)九宮格拖拽、刪除功能_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android怎么仿微信發(fā)動(dòng)態(tài)九宮格拖拽、刪除功能

這篇文章主要介紹Android怎么仿微信發(fā)動(dòng)態(tài)九宮格拖拽、刪除功能,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!1、完美1比1仿照微信仿微信發(fā)動(dòng)態(tài)九宮格拖拽、刪除暴力拖拽ui有點(diǎn)問題,不影響使用,資源文件自己找個(gè)+號(hào)2、微信發(fā)動(dòng)態(tài)拖拽bug當(dā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="/apk/res/android"

xmlns:app="/apk/res-auto"

xmlns:tools="/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的長度等于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.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論