Android 는 손가락 을 따라 드래그 하고 자동 으로 테 두 리 를 붙 이 는 View 스타일(인 스 턴 스 데모)을 구현 합 니 다.
코드
/**
* , View
*/
public class DragView extends ImageView implements View.OnTouchListener{
private int screenWidth;
private int screenHeight;
private Context mContext;
private int lastX, lastY;
private int left ,top;
private ViewGroup.MarginLayoutParams layoutParams;
private int startX;
private int endX;
private boolean isMoved = false;
private onDragViewClickListener mLister;
public interface onDragViewClickListener{
void onDragViewClick();
}
public void setOnDragViewClickListener(onDragViewClickListener listener){
this.mLister = listener;
}
public DragView(Context context) {
this(context,null);
}
public DragView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
screenWidth = displayMetrics.widthPixels;
screenHeight = displayMetrics.heightPixels-getStatusBarHeight();
init();
}
public void init(){
setOnTouchListener(this);
post(new Runnable() {
@Override
public void run() {
layoutParams = (ViewGroup.MarginLayoutParams)getLayoutParams();
layoutParams.topMargin = screenHeight - getHeight();
layoutParams.leftMargin = screenWidth - getWidth();
setLayoutParams(layoutParams);
}
});
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
startX = lastX;
break;
case MotionEvent.ACTION_MOVE:
isMoved = true;
int dx = (int) event.getRawX() - lastX;
int dy = (int) event.getRawY() - lastY;
left = v.getLeft() + dx;
top = v.getTop() + dy;
int right = v.getRight() + dx;
int bottom = v.getBottom() + dy;
//
if (left < 0) {
left = 0;
right = left + v.getWidth();
}
if (right > screenWidth) {
right = screenWidth;
left = right - v.getWidth();
}
if (top < 0) {
top = 0;
bottom = top + v.getHeight();
}
if (bottom > screenHeight) {
bottom = screenHeight;
top = bottom - v.getHeight();
}
v.layout(left, top, right, bottom );
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_UP:
// ,
if (isMoved) {
layoutParams = (ViewGroup.MarginLayoutParams)getLayoutParams();
layoutParams.topMargin = top;
setLayoutParams(layoutParams);
}
endX = (int) event.getRawX();
// ,
if (Math.abs(startX - endX) < 6) {
return false;
}
if (left +v.getWidth()/2 < screenWidth/2) {
startScroll(left,screenWidth/2,true);
} else {
startScroll(left,screenWidth/2,false);
}
break;
}
return true;
}
//
@Override
public boolean onTouchEvent(MotionEvent event) {
mLister.onDragViewClick();
return super.onTouchEvent(event);
}
public void startScroll(final int start, int end, final boolean isLeft){
ValueAnimator valueAnimator = ValueAnimator.ofFloat(start,end).setDuration(800);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
if (isLeft) {
layoutParams.leftMargin = (int) (start*(1-animation.getAnimatedFraction()));
} else {
layoutParams.leftMargin = (int) (start + (screenWidth - start - getWidth())*(animation.getAnimatedFraction()));
}
setLayoutParams(layoutParams);
}
});
valueAnimator.start();
}
/**
*
* @return
*/
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
}
위 에서 소개 한 안 드 로 이 드 는 손가락 을 따라 드래그 하고 자동 으로 테 두 리 를 붙 이 는 뷰 스타일 로 여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주시 면 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.