高仿微信对话列表滑动删除效果(1)

e.printStackTrace();

}

}

}

@Override

public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN: {

int x = (int) event.getX();

int y = (int) event.getY();

int position = pointToPosition(x, y);

Log.e(TAG, “postion=” + position);

if (position != INVALID_POSITION) {

Message data = (Message) getItemAtPosition(position);

mFocusedItemView = data.getSlideView();

Log.e(TAG, “FocusedItemView=” + mFocusedItemView);

}

}

default:

break;

}

if (mFocusedItemView != null) {

mFocusedItemView.onRequireTouchEvent(event);

}

return true;

}

再看SlideView.java:

public class SlideView extends LinearLayout {

private static final String TAG = “SlideView”;

private Context mContext;

private LinearLayout mViewContent;

private RelativeLayout mHolder;

private Scroller mScroller;

private OnSlideListener mOnSlideListener;

private int mHolderWidth = 120;

private int mLastX = 0;

private int mLastY = 0;

private static final int TAN = 2;

private boolean isScroller=false;//是否已经滑动

public interface OnSlideListener {

public static final int SLIDE_STATUS_OFF = 0;

public static final int SLIDE_STATUS_START_SCROLL = 1;

public static final int SLIDE_STATUS_ON = 2;

/**

  • @param view current SlideView

  • @param status SLIDE_STATUS_ON or SLIDE_STATUS_OFF

*/

public void onSlide(View view, int status);

}

public SlideView(Context context) {

super(context);

initView();

}

public SlideView(Context context, AttributeSet attrs) {

super(context, attrs);

initView();

}

private void initView() {

mContext = getContext();

mScroller = new Scroller(mContext);

setOrientation(LinearLayout.HORIZONTAL);

View.inflate(mContext, R.layout.slide_view_merge, this);

mViewContent = (LinearLayout) findViewById(R.id.view_content);

mHolderWidth = Math.round(TypedValue.applyDimension(

TypedValue.COMPLEX_UNIT_DIP, mHolderWidth, getResources()

.getDisplayMetrics()));

}

public void setButtonText(CharSequence text) {

((TextView)findViewById(R.id.delete)).setText(text);

}

public void setContentView(View view) {

mViewContent.addView(view);

}

public void setOnSlideListener(OnSlideListener onSlideListener) {

mOnSlideListener = onSlideListener;

}

public void shrink() {

if (getScrollX() != 0) {

this.smoothScrollTo(0, 0);

}

}

public void onRequireTouchEvent(MotionEvent event) {

int x = (int) event.getX();

int y = (int) event.getY();

int scrollX = getScrollX();

Log.d(TAG, “x=” + x + " y=" + y);

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN: {

if (!mScroller.isFinished()) {

mScroller.abortAnimation();

}

if (mOnSlideListener != null) {

mOnSlideListener.onSlide(this,

OnSlideListener.SLIDE_STATUS_START_SCROLL);

}

break;

}

case MotionEvent.ACTION_MOVE: {

int deltaX = x - mLastX;

int deltaY = y - mLastY;

if (Math.abs(deltaX) < Math.abs(deltaY) * TAN) {

break;

}

int newScrollX = scrollX - deltaX;

if (deltaX != 0) {

if(isScroller){

this.shrink();

}else{

if (newScrollX < 0) {

newScrollX = 0;

} else if (newScrollX > mHolderWidth) {

newScrollX = mHolderWidth;

}

this.scrollTo(newScrollX, 0);

}

}

break;

}

case MotionEvent.ACTION_UP: {

int newScrollX = 0;

if (scrollX - mHolderWidth * 0.75 > 0) {

newScrollX = mHolderWidth;

}

if(isScroller){

this.shrink();

isScroller=false;

}else{

this.smoothScrollTo(newScrollX, 0);

if (mOnSlideListener != null) {

mOnSlideListener.onSlide(this,

newScrollX == 0 ? OnSlideListener.SLIDE_STATUS_OFF
OnSlideListener.SLIDE_STATUS_ON);

}

isScroller=true;

}

break;

}

default:

break;

}

mLastX = x;

mLastY = y;

}

private void smoothScrollTo(int destX, int destY) {

// 缓慢滚动到指定位置

int scrollX = getScrollX();

int delta = destX - scrollX;

mScroller.startScroll(scrollX, 0, delta, 0, Math.abs(delta) * 3);

invalidate();

}

@Override

public void computeScroll() {

if (mScroller.computeScrollOffset()) {

scrollTo(mScroller.getCurrX(), mScroller.getCurrY());

postInvalidate();

}

}

上述代码做了很详细的说明,这就是滑动控件的完整代码,大家要明白的是:你所添加的view都是加在SlideView的子View : view_content中的,而不是直接加在SlideView中,只有这样我们才方便做滑动效果。

最后一步我们来看看适配器里面的代码:

public class Carpa_MySelf_MessageCenterAdapter extends BaseAdapter implements OnSlideListener,OnClickListener{

private LayoutInflater inflater;

private List messages;

private Context context;

private SlideView mSlideView;

private int position;//删除位置数据

private Handler handler;

public Carpa_MySelf_MessageCenterAdapter(Context context,ArrayList messages,Handler handler){

setData(messages);

this.context=context;

inflater=LayoutInflater.from(context);

this.handler=handler;

}

public void setData(ArrayList messages){

if(messages==null){

this.messages=new ArrayList();

}else{

this.messages=messages;

}

}

public void setPosition(int position){

this.position=position;

}

@Override

public int getCount() {

// TODO Auto-generated method stub

return messages.size();

}

@Override

public Object getItem(int position) {

// TODO Auto-generated method stub

return messages.get(position);

}

@Override

public long getItemId(int position) {

// TODO Auto-generated method stub

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder;

SlideView slideView = (SlideView) convertView;

if (slideView == null) {

View itemView = inflater.inflate(R.layout.carpa_myself_message_center_item, null);

slideView = new SlideView(context);

slideView.setContentView(itemView);

holder = new ViewHolder(slideView);

slideView.setOnSlideListener(Carpa_MySelf_MessageCenterAdapter.this);

slideView.setTag(holder);

} else {

holder = (ViewHolder) slideView.getTag();

}

Message msgMessage=messages.get(position);

msgMessage.setSlideView(slideView);

msgMessage.getSlideView().shrink();

String sourceString=msgMessage.getSourceStr();

holder.tvContent.setText(“内容:”+msgMessage.getContentStr());

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

下面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题全套解析,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,下面只是以图片的形式给大家展示一部分。

image

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

image

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

holder.tvContent.setText(“内容:”+msgMessage.getContentStr());

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

下面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题全套解析,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,下面只是以图片的形式给大家展示一部分。

[外链图片转存中…(img-tFHfezVA-1715433380878)]

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

[外链图片转存中…(img-bigN9Y5q-1715433380879)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值