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

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

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 仿微信发动态九宫格拖拽、删除功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • [Android] 通过GridView仿微信动态添加本地图片示例代码

    前面文章讲述的都是"随手拍"中图像处理的操作,此篇文章主要讲述GridView控件实现添加本地图片并显示.主要是关于GridView控件的基本操作,通常可以通过自定义继承BaseAdapter的适配器加载图片,而下面讲述的不是自定义的适配器,而是调用SimpleAdapter实现的.至于上传发布与网络交互此处不讲述,后面文章会讲! 一. 实现效果 主要是通过点击+从本地相册中添加图片,同时显示图片至GridView.点击图片可以进行删除操作,同时界面中的发布EditView控件也很好看

  • Android 高仿微信朋友圈动态支持双击手势放大并滑动查看图片效果

    最近参与了开发一款旅行APP,其中包含实时聊天和动态评论功能,终于耗时几个月几个伙伴完成了,今天就小结一下至于实时聊天功能如果用户不多的情况可以scoket实现,如果用户万级就可以采用开源的smack + opnefile实现,也可以用mina开源+XMMP,至于怎么搭建和实现,估计目前github上一搜一大把,至于即时通讯怕误人子弟,暂且不做介绍,现就把实现的一个微信朋友圈的小功能介绍一下. 先上效果图: 一拿到主流的UI需求,大致分析下,需要我ListView嵌套Gridview,而grid

  • Android实现九宫格(GridView中各项平分空间)的方法

    本文实例讲述了Android实现九宫格(GridView中各项平分空间)的方法.分享给大家供大家参考.具体如下: 项目需要做一个九宫格(也不一定是9的,4宫格.16宫格.4x3宫格...),封了 一个宫格,它能够根据为它分配的空间来自动的调节宫中各项的尺寸. 从TableLayout集成来的,因此如果你直接在设计器上使用该封装的话需要把它自动加进去的那几个TableRow删除一下. 类名为AdvancedGridView,代码如下: import android.content.Context;

  • Android编程之九宫格实现方法实例分析

    本文实例讲述了Android编程之九宫格实现方法.分享给大家供大家参考,具体如下: 显示九宫格需要用GridView , 要显示每个格子中的视图有两种方式,第一种方式是做成xml文件,再将xml文件做成视图.第二种方式就是在代码中构建出这样一种布局,这里采用第一种方式来实现: GridView: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="ht

  • Android打造流畅九宫格抽奖活动效果

    因为company项目中需要做九宫格抽奖活动,以前都没有做过类似的功能,虽然之前在浏览大神们的博客中,无意中也看到了好多关于抽奖的项目,但因为项目中没有需要,一直都没有点击进去看.这次不去看估计不行.直到公司计划要做抽奖功能,才迫不得已上网查找demo 网上找了大半天,好不容易找到了几个demo,下载下来,解压缩包发现竟然里面空空如也,只有几张九宫格的图片,害我白白浪费了几个CSDN积分.后面在eoe网站那发现了一个demo,于是好开心,下载下来后马上导入到工程中,运行看了效果,九宫格是出来了,

  • Android 九宫格的实现方法

    1.xml代码: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?>  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"       android:orientation="vertical"      android:layout_width="fill

  • Android GridView扩展仿微信微博发图动态添加删除图片功能

    在平时的开发中,我们会看到不管是微信发朋友圈照片还是微博发布新鲜事,添加图片的时候都是选完后面还有个+号再去选择图片,这样的话比较方便用户去添加图片,有的右上角还有个-号方便用户去删除图片,而一般用户选择的图片多少都是不定的,我们只限制最大张数,我们用gridview去实现,代码可能比较简单,高手请略过. 0.效果图 1.准备资源图片 添加图片的+号图片 删除图片的图片 2.可设置限制用户选择最大张数 /** * 可以动态设置最多上传几张,之后就不显示+号了,用户也无法上传了 * 默认9张 */

  • android 九宫格滑动解锁开机实例源码学习

    效果图由于网站占时不能上传,以后补上. NinePointLineView.java 复制代码 代码如下: package org.demo.custon_view; import org.demo.utils.MLog; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; imp

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

    1.完美1比1 仿照微信仿微信发动态 九宫格拖拽.删除 暴力拖拽ui有点问题,不影响使用,资源文件自己找个+号 2.微信发动态拖拽bug 当选择完图片,长按图片拖拽过程中按下屏幕home键盘,再次进入这时候就不能点击输入文字,点击输入文字的时候会触发选择相册事件 3.拖拽事件用的basequickadapter implementation 'com.android.support:recyclerview-v7:28.0.0' implementation "com.github.CymCha

  • Android仿微信发朋友圈浏览图片效果

    先看一下效果吧: 下面就来说一下具体怎么实现的: 实现思路 1.首先我们要获取数据源,数据源就是我们的每条说说(包括姓名.标题.图片数组) 2.自定义适配器(ListView嵌套着GridView) 3.图片点击浏览图片(Fragment+ViewPager) 具体实现 1.初始化数据源,设置适配器,看一下代码: public class MyActivity extends Activity { /*图片显示列表*/ private ListView listView; /*图片URL数组*/

  • Android条目拖拽删除功能实例代码

    项目中需求,要做条目条目拖拽删除效果,实际效果和QQ消息删除一样,侧滑有制定和删除. 效果图 第一步效果图 1.0自定义控件 SwipeLayout 继承FrameLayout重写里面三个构造方法,分别调用initView(). 2.0在布局中使用自定义控件 3.0在initView()方法中,创建拖拽辅辅助工具 ViewDragHelper() 该方法需要传入回调 MyCallBack() 4.0,创建MyCallBack()回调,继承ViewDragHelper.Callback 在回调中

  • 基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能

    用Vue2实现移动端图片上传.压缩.拖拽排序.拖拽删除功能 图片上传图片压缩拖拽排序.拖拽删除 之前在公司开发过一段时间的移动端H5页面,有个功能就是要上传图片+压缩.参考了一下网上的方法,外加自己摸索的过程,最终实现了这个功能.后面在家闲的时候又加多了个长按选中图片,并且可以拖拽排序.拖拽到指定位置删除的功能. github地址:代码地址 下面直接进入正题: 图片上传 图片上传用的是HTML的input标签实现的.核心就是把获取到的文件通过FileReader转换成图片,代码如下: <inpu

  • Android仿微信滑动弹出编辑、删除菜单效果、增加下拉刷新功能

    如何为不同的list item呈现不同的菜单,本文实例就为大家介绍了Android仿微信或QQ滑动弹出编辑.删除菜单效果.增加下拉刷新等功能的实现,分享给大家供大家参考,具体内容如下 效果图: 1. 下载开源项目,并将其中的liberary导入到自己的项目中: 2. 使用SwipeMenuListView代替ListView,在页面中布局: <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeRefresh

  • js实现QQ邮箱邮件拖拽删除功能

    本文实例为大家分享了js实现QQ邮箱邮件拖拽删除的具体代码,供大家参考,具体内容如下 步骤分析: 根据数据结构生成HTML结构 全选和单选功能的实现,以及当其为选中状态时它的父级的颜色变化的 点击删除,删除结构同时删除数据 给每一个li绑定mousedown,tip显示,并且定位在鼠标位置 鼠标移动时,tip跟随,取消默认行为 碰撞检测是否拖到"已删除"项 鼠标松开.删除结构和数据 过程实现 HTML代码 <body> <div class="wrap&qu

  • Android仿QQ消息提示点拖拽功能

    很久以前,发现QQ有一个很有趣的功能,就是未读消息的红点是可以拖拽的,而且在任何地方都可以随意拖拽,并且有一个弹性的动画,非常有趣,而且也是一个非常方便的功能,于是总想仿制一个,虽说仿制,但也只是他的拖拽功能,弹性效果还是能力有限. 不多说 先上效果 一个自定义的view 使用方式也很简单 <com.weizhenbin.show.widget.VanishView android:layout_width="30dp" android:layout_height="3

  • Android仿微信朋友圈点击加号添加图片功能

    本文为大家分享了类似微信朋友圈,点击+号图片,可以加图片功能,供大家参考,具体内容如下 xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto

  • Android使用贝塞尔曲线仿QQ聊天消息气泡拖拽效果

    本文实例为大家分享了Android仿QQ聊天消息气泡拖拽效果展示的具体代码,供大家参考,具体内容如下 先画圆,都会吧.代码如下: public class Bezier extends View { private final Paint mGesturePaint = new Paint(); private final Path mPath = new Path(); private float mX1 = 100, mY1 = 150; private float mX2 = 300, m

  • Android仿QQ未读消息--红点拖拽删除【源代码】

    本Demo是一款仿qq未读消息拖拽删除的例子,继承RelativeLayout的WaterDrop实现了圆形图标功能.继承ImageView的CircleImageView圆形图片功能.效果非常不错.很适合有圆形设计的哥们.效果图片如下 CircleImageView核心代码 private void updateShaderMatrix() { float scale; float dx = 0; float dy = 0; mShaderMatrix.set(null); if (mBitm

随机推荐