Android 사용자 정의 ListView 는 QQ 를 모방 하여 목록 을 끌 어 당 길 수 있 습 니 다.
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv_logo"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentLeft="true"
android:layout_centerInParent="true"
android:layout_marginLeft="10dp"/>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@id/iv_logo"/>
</RelativeLayout>
이것 은 단지 하나의 두상 과 한 마디 뿐 이 었 다.그리고 우 리 는 실체 류 도 다 썼 다.DragBean
package com.liuguilin.draglistviewsample.entity;
/*
* : DragListViewSample
* : com.liuguilin.draglistviewsample.entity
* : DragBean
* : LGL
* : 2016/8/29 22:49
* :
*/
public class DragBean {
private int ivId;
private String text;
public DragBean() {
}
public DragBean(int ivId, String text) {
this.ivId = ivId;
this.text = text;
}
public int getIvId() {
return ivId;
}
public String getText() {
return text;
}
}
ok,사실은 아주 간단 합 니 다.id 는 그림 이 고 그 다음 에 텍스트 입 니 다.그러면 우 리 는 Adapter 를 실현 할 수 있 습 니 다.여기 서 저 는 Array Adapter 를 사용 하여 삽입 과 삭 제 를 쉽게 할 수 있 습 니 다.DragAdapter
package com.liuguilin.draglistviewsample.adapter;
/*
* : DragListViewSample
* : com.liuguilin.draglistviewsample.adapter
* : DragAdapter
* : LGL
* : 2016/8/29 22:41
* :
*/
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.liuguilin.draglistviewsample.R;
import com.liuguilin.draglistviewsample.entity.DragBean;
import java.util.List;
public class DragAdapter extends ArrayAdapter<DragBean> {
/**
*
*
* @param context
* @param mList
*/
public DragAdapter(Context context, List<DragBean> mList) {
super(context, 0, mList);
}
/**
* View
*
* @param position
* @param convertView
* @param parent
* @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder viewHolder;
if (convertView == null) {
view = View.inflate(getContext(), R.layout.list_item, null);
viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) view
.findViewById(R.id.iv_logo);
viewHolder.textView = (TextView) view.findViewById(R.id.textView);
view.setTag(viewHolder);
} else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.imageView.setImageResource(getItem(position).getIvId());
viewHolder.textView.setText(getItem(position).getText());
return view;
}
/**
*
*/
static class ViewHolder {
ImageView imageView;
TextView textView;
}
}
네,사실 여기까지 왔 습 니 다.그 는 가장 일반적인 ListView 입 니 다.우 리 는 그 에 게 데 이 터 를 채 워 주 었 습 니 다.MainActivity
package com.liuguilin.draglistviewsample;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.liuguilin.draglistviewsample.adapter.DragAdapter;
import com.liuguilin.draglistviewsample.entity.DragBean;
import com.liuguilin.draglistviewsample.view.DragListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
//
private DragListView mListView;
//
private List<DragBean> mList = new ArrayList<>();
//
private DragAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
/**
* View
*/
private void initView() {
mListView = (DragListView) findViewById(R.id.mListView);
//
for (int i = 0; i < 30; i++) {
DragBean bean = new DragBean(R.mipmap.ic_launcher, " " + i);
mList.add(bean);
}
//
adapter = new DragAdapter(this,mList);
mListView.setAdapter(adapter);
}
}
이제 실제 효 과 를 볼 수 있어 요.이제 저희 ListView 다시 쓸 수 있어 요.
우 리 는 먼저 그의 사건 을 차단 했다.
/**
*
*
*
*
* @param ev
* @return
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
//
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
//
int x = (int) ev.getX();
int y = (int) ev.getY();
//
mStartPosition = mEndPosition = pointToPosition(x, y);
// logo
ViewGroup itemView = (ViewGroup) getChildAt(mStartPosition - getFirstVisiblePosition());
// Y
dragPoint = y - itemView.getTop();
//ListView Y
dragOffset = (int) (ev.getRawY() - y);
//
View dragger = itemView.findViewById(R.id.iv_logo);
// logo
if (dragger != null && x < dragger.getRight() + 10) {
// ListView
//
upScroll = getHeight() / 3;
//
downScroll = getHeight() * 2 / 3;
// /
itemView.setDrawingCacheEnabled(true);
//
Bitmap bitMap = itemView.getDrawingCache();
//
startDrag(bitMap, y);
}
break;
}
// View
return false;
}
그의 position 를 가 져 온 후에 우 리 는 직접 캡 처 하고 우리 의 window 를 표시 합 니 다.여기 서 하 는 일이 비교적 많 습 니 다.우 리 는 프로필 사진 을 눌 렀 는 지 판단 해 야 window 를 표시 할 수 있 습 니 다.
/**
* Y ,
*
* @param bitMap
* @param y
*/
private void startDrag(Bitmap bitMap, int y) {
//
wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
//
lParams = new WindowManager.LayoutParams();
//
lParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
lParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
//
lParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
//
lParams.alpha = 0.8f;
//
lParams.gravity = Gravity.TOP;
// xy
lParams.x = 0;
lParams.y = y-dragPoint + dragOffset;
//
lParams.format = PixelFormat.TRANSLUCENT;
//
lParams.windowAnimations = 0;
//
dragImageView = new ImageView(getContext());
//
dragImageView.setImageBitmap(bitMap);
//
wm.addView(dragImageView, lParams);
}
알 겠 습 니 다.window 를 초기 화 하 겠 습 니 다.표시 만 으로 는 안 됩 니 다.우 리 는 미 끄 러 질 수 있 습 니 다.어떻게 감청 합 니까?onTouch Event 의 ACTIONMOVE 사건 은 할 수 있어 요.
/**
*
*
* @param ev
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
//
if (dragImageView != null && mEndPosition != INVALID_POSITION) {
//
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
// Y
int moveY = (int) ev.getY();
doDrag(moveY);
break;
//
case MotionEvent.ACTION_UP:
int upY = (int) ev.getY();
stopDrag();
onDrag(upY);
break;
}
}
//
return true;
}
우 리 는 이동 할 때 끊임없이 그의 위 치 를 갱신 했다.
/**
*
*
* @param moveY
*/
private void doDrag(int moveY) {
if (dragImageView != null) {
lParams.y = moveY - dragPoint + dragOffset;
wm.updateViewLayout(dragImageView, lParams);
}
// -1
int tempLine = pointToPosition(0, moveY);
//
if (tempLine != INVALID_POSITION) {
//
mEndPosition = tempLine;
}
// 、
int scrollSpeed = 0;
//
if (moveY < upScroll) {
scrollSpeed = 10;
//
} else if (moveY > downScroll) {
scrollSpeed = -10;
}
//
if (scrollSpeed != 0) {
// Y
int dragItemY = getChildAt(mEndPosition - getFirstVisiblePosition()).getTop();
//
int dy = dragItemY + scrollSpeed;
//
setSelectionFromTop(mEndPosition, dy);
}
}
네가 이동 이 끝 난 후에 나 는 너의 window 체 를 멈 출 수 있다.
/**
*
*/
private void stopDrag() {
//
if (dragImageView != null) {
wm.removeView(dragImageView);
dragImageView = null;
}
}
이렇게 하면,나 는 직접 너의 position 를 연결 하여 끌 어 당 기 는 효 과 를 얻 을 것 이다.
/**
*
*
* @param upY
*/
private void onDrag(int upY) {
//
// -1
int tempLine = pointToPosition(0, upY);
//
if (tempLine != INVALID_POSITION) {
//
mEndPosition = tempLine;
}
/**
*
*/
//
if (upY < getChildAt(1).getTop()) {
mEndPosition = 1;
//
} else if (upY > getChildAt(getChildCount() - 1).getTop()) {
mEndPosition = getAdapter().getCount() - 1;
}
// item
if (mEndPosition > 0 && mEndPosition < getAdapter().getCount()) {
DragAdapter adapter = (DragAdapter) getAdapter();
//
adapter.remove(adapter.getItem(mStartPosition));
//
adapter.insert(adapter.getItem(mStartPosition), mEndPosition);
}
}
모든 코드 붙 이기DragListView
package com.liuguilin.draglistviewsample.view;
/*
* : DragListViewSample
* : com.liuguilin.draglistviewsample.view
* : DragListView
* : LGL
* : 2016/8/29 20:50
* : QQ ListView
*/
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.ListView;
import com.liuguilin.draglistviewsample.R;
import com.liuguilin.draglistviewsample.adapter.DragAdapter;
public class DragListView extends ListView {
// position
private int mStartPosition;
// position
private int mEndPosition;
// Y
private int dragPoint;
//ListView Y
private int dragOffset;
//
private int upScroll;
//
private int downScroll;
//
private WindowManager wm;
//
private ImageView dragImageView;
//
private WindowManager.LayoutParams lParams;
//
public DragListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
*
*
*
*
* @param ev
* @return
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
//
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
//
int x = (int) ev.getX();
int y = (int) ev.getY();
//
mStartPosition = mEndPosition = pointToPosition(x, y);
// logo
ViewGroup itemView = (ViewGroup) getChildAt(mStartPosition - getFirstVisiblePosition());
// Y
dragPoint = y - itemView.getTop();
//ListView Y
dragOffset = (int) (ev.getRawY() - y);
//
View dragger = itemView.findViewById(R.id.iv_logo);
// logo
if (dragger != null && x < dragger.getRight() + 10) {
// ListView
//
upScroll = getHeight() / 3;
//
downScroll = getHeight() * 2 / 3;
// /
itemView.setDrawingCacheEnabled(true);
//
Bitmap bitMap = itemView.getDrawingCache();
//
startDrag(bitMap, y);
}
break;
}
// View
return false;
}
/**
* Y ,
*
* @param bitMap
* @param y
*/
private void startDrag(Bitmap bitMap, int y) {
//
wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
//
lParams = new WindowManager.LayoutParams();
//
lParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
lParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
//
lParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
//
lParams.alpha = 0.8f;
//
lParams.gravity = Gravity.TOP;
// xy
lParams.x = 0;
lParams.y = y-dragPoint + dragOffset;
//
lParams.format = PixelFormat.TRANSLUCENT;
//
lParams.windowAnimations = 0;
//
dragImageView = new ImageView(getContext());
//
dragImageView.setImageBitmap(bitMap);
//
wm.addView(dragImageView, lParams);
}
/**
*
*
* @param ev
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
//
if (dragImageView != null && mEndPosition != INVALID_POSITION) {
//
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
// Y
int moveY = (int) ev.getY();
doDrag(moveY);
break;
//
case MotionEvent.ACTION_UP:
int upY = (int) ev.getY();
stopDrag();
onDrag(upY);
break;
}
}
//
return true;
}
/**
*
*
* @param upY
*/
private void onDrag(int upY) {
//
// -1
int tempLine = pointToPosition(0, upY);
//
if (tempLine != INVALID_POSITION) {
//
mEndPosition = tempLine;
}
/**
*
*/
//
if (upY < getChildAt(1).getTop()) {
mEndPosition = 1;
//
} else if (upY > getChildAt(getChildCount() - 1).getTop()) {
mEndPosition = getAdapter().getCount() - 1;
}
// item
if (mEndPosition > 0 && mEndPosition < getAdapter().getCount()) {
DragAdapter adapter = (DragAdapter) getAdapter();
//
adapter.remove(adapter.getItem(mStartPosition));
//
adapter.insert(adapter.getItem(mStartPosition), mEndPosition);
}
}
/**
*
*/
private void stopDrag() {
//
if (dragImageView != null) {
wm.removeView(dragImageView);
dragImageView = null;
}
}
/**
*
*
* @param moveY
*/
private void doDrag(int moveY) {
if (dragImageView != null) {
lParams.y = moveY - dragPoint + dragOffset;
wm.updateViewLayout(dragImageView, lParams);
}
// -1
int tempLine = pointToPosition(0, moveY);
//
if (tempLine != INVALID_POSITION) {
//
mEndPosition = tempLine;
}
// 、
int scrollSpeed = 0;
//
if (moveY < upScroll) {
scrollSpeed = 10;
//
} else if (moveY > downScroll) {
scrollSpeed = -10;
}
//
if (scrollSpeed != 0) {
// Y
int dragItemY = getChildAt(mEndPosition - getFirstVisiblePosition()).getTop();
//
int dy = dragItemY + scrollSpeed;
//
setSelectionFromTop(mEndPosition, dy);
}
}
}
그리고 인용 하 겠 습 니 다.layout_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<com.liuguilin.draglistviewsample.view.DragListView
android:id="@+id/mListView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
참,창 추가 권한 잊 지 마 세 요.
<!-- -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
이 일련의 일 을 끝 낸 후에 이 구상 이 사실 옳다 고 생각 한 후에 우 리 는 시험 적 으로 운행 할 수 있다.위 에서 말 한 것 은 소 편 이 소개 한 안 드 로 이 드 사용자 정의 ListView 가 QQ 를 모방 하여 목록 을 끌 수 있 는 기능 을 실현 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.