1;关于Listview中的Item设置成某个图片样子。
效果图
图文件;
代码;在适配器中的getView操作
2;界面设置背景
3;设置这种按钮
//在layout文件中的Botton设置
android:background=”@drawable/bg_alibuybutton”
建立四个xml文件
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true"
android:drawable="@drawable/bg_alibuybutton_pressed" />
<item android:state_focused="true"
android:drawable="@drawable/bg_alibuybutton_selected" />
<item android:drawable="@drawable/bg_alibuybutton_default" />
</selector>
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape android:shape="rectangle">
<solid android:color="#d2b48c" />
<corners
android:topLeftRadius="5dip"
android:topRightRadius="5dip"
android:bottomLeftRadius="5dip"
android:bottomRightRadius="5dip" />
</shape>
</item>
<item android:top="1px" android:bottom="1px" android:left="1px" android:right="1px">
<shape>
<gradient
android:startColor="#d2b48c" android:endColor="#d2691e"
android:type="linear" android:angle="90"
android:centerX="0.5" android:centerY="0.5" />
<corners
android:topLeftRadius="5dip"
android:topRightRadius="5dip"
android:bottomLeftRadius="5dip"
android:bottomRightRadius="5dip" />
</shape>
</item>
</layer-list>
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape android:shape="rectangle">
<solid android:color="#90ee90" />
<corners
android:topLeftRadius="5dip"
android:topRightRadius="5dip"
android:bottomLeftRadius="5dip"
android:bottomRightRadius="5dip" />
</shape>
</item>
<item android:top="1px" android:bottom="1px" android:left="1px" android:right="1px">
<shape>
<gradient
android:startColor="#90ee90" android:endColor="#98fb98"
android:type="linear" android:angle="90"
android:centerX="0.5" android:centerY="0.5" />
<corners
android:topLeftRadius="5dip"
android:topRightRadius="5dip"
android:bottomLeftRadius="5dip"
android:bottomRightRadius="5dip" />
</shape>
</item>
</layer-list>
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape android:shape="rectangle">
<solid android:color="#FFEC7600" />
<corners
android:topLeftRadius="5dip"
android:topRightRadius="5dip"
android:bottomLeftRadius="5dip"
android:bottomRightRadius="5dip" />
</shape>
</item>
<item android:top="1px" android:bottom="1px" android:left="1px" android:right="1px">
<shape>
<gradient
android:startColor="#FFEC7600" android:endColor="#FFFED69E"
android:type="linear" android:angle="90"
android:centerX="0.5" android:centerY="0.5" />
<corners
android:topLeftRadius="5dip"
android:topRightRadius="5dip"
android:bottomLeftRadius="5dip"
android:bottomRightRadius="5dip" />
</shape>
</item>
</layer-list>
4;ToggleButton按钮设置
效果图
layout文件中button设置
android:background=”@drawable/bg_button”
三个xml文件;
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" android:drawable="@drawable/bg_button_focused">
</item>
<item android:drawable="@drawable/bg_button_normal">
</item>
</selector>
<?xml version="1.0" encoding="UTF-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 填充的颜色 -->
<solid android:color="@color/green" />
<!-- 设置按钮的四个角为弧形 -->
<!-- android:radius 弧形的半径 -->
<corners android:radius="80dip" />
<!-- padding:Button里面的文字与Button边界的间隔 -->
<padding
android:left="2dp"
android:top="2dp"
android:right="2dp"
android:bottom="2dp"
/>
</shape>
<?xml version="1.0" encoding="UTF-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 填充的颜色 -->
<solid android:color="@color/powderblue" />
<!-- 设置按钮的四个角为弧形 -->
<!-- android:radius 弧形的半径 -->
<corners android:radius="80dip" />
<!-- padding:Button里面的文字与Button边界的间隔 -->
<padding
android:left="2dp"
android:top="2dp"
android:right="2dp"
android:bottom="2dp"
/>
</shape>
5;显示popupWindow悬浮框
点击参数设置,弹出悬浮框
在点击事件中调用showSettingPopwindow这个方法;
/**
* 显示popupWindow悬浮框
*/
private void showSettingPopwindow() {
// 利用layoutInflater获得View
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.popwindow_setting, null);
// 下面是两种方法得到宽度和高度 getWindow().getDecorView().getWidth()
final PopupWindow window = new PopupWindow(view, WindowManager.LayoutParams.MATCH_PARENT, 1500);
// 设置popWindow弹出窗体可点击,这句话必须添加,并且是true
window.setFocusable(true);
// 实例化一个ColorDrawable颜色为半透明0xb00000
ColorDrawable dw = new ColorDrawable(0xb00000);
window.setBackgroundDrawable(dw);
// 设置popWindow的显示和消失动画
window.setAnimationStyle(R.style.mypopwindow_anim_style);
// 在底部显示,第一个参数是parent,不是在其中显示,而是通过子控件找到主窗体,随便一个子控件都行
window.showAtLocation(Connect_sthsaActivity.this.findViewById(R.id.connect_tb), Gravity.BOTTOM, 0, 0);
// 获取控件
time_et = (EditText) view.findViewById(R.id.time_et);
temHumIp_et = (EditText) view.findViewById(R.id.temHumIp_et);
temHumPort_et = (EditText) view.findViewById(R.id.temHumPort_et);
smokeIp_et = (EditText) view.findViewById(R.id.smokeIp_et);
smokePort_et = (EditText) view.findViewById(R.id.smokePort_et);
fanIp_et = (EditText) view.findViewById(R.id.fanIp_et);
fanPort_et = (EditText) view.findViewById(R.id.fanPort_et);
tubeIp_et = (EditText) view.findViewById(R.id.tubeIp_et);
tubePort_et = (EditText) view.findViewById(R.id.tubePort_et);
buzzerIp_et = (EditText) view.findViewById(R.id.buzzerIp_et);
buzzerPort_et = (EditText) view.findViewById(R.id.buzzerPort_et);
cancel = (Button) view.findViewById(R.id.cancelBtn);
confirm = (Button) view.findViewById(R.id.confirmBtn);
// 初始化界面
smokeIp_et.setText(Const.SMOKE_IP);
smokePort_et.setText(String.valueOf(Const.SMOKE_PORT));
temHumIp_et.setText(Const.TEMHUM_IP);
temHumPort_et.setText(String.valueOf(Const.TEMHUM_PORT));
fanIp_et.setText(Const.FAN_IP);
fanPort_et.setText(String.valueOf(Const.FAN_PORT));
tubeIp_et.setText(Const.TUBE_IP);
tubePort_et.setText(String.valueOf(Const.TUBE_PORT));
buzzerIp_et.setText(Const.BUZZER_IP);
buzzerPort_et.setText(String.valueOf(Const.BUZZER_PORT));
time_et.setText(String.valueOf(Const.time));
// 点击事件
// 取消
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
window.dismiss();
}
});
// 确定
confirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 获取采集周期、IP、端口、上下限
String SMOKE_IP = smokeIp_et.getText().toString().trim();
String SMOKE_PORT = smokePort_et.getText().toString().trim();
String TEMHUM_IP = temHumIp_et.getText().toString().trim();
String TEMHUM_PORT = temHumPort_et.getText().toString().trim();
String FAN_IP = fanIp_et.getText().toString().trim();
String FAN_PORT = fanPort_et.getText().toString().trim();
String TUBE_IP = tubeIp_et.getText().toString().trim();
String TUBE_PORT = tubePort_et.getText().toString().trim();
String BUZZER_IP = buzzerIp_et.getText().toString().trim();
String BUZZER_PORT = buzzerPort_et.getText().toString().trim();
String time = time_et.getText().toString().trim();
if (checkIpPort(SMOKE_IP, SMOKE_PORT) && checkIpPort(TEMHUM_IP, TEMHUM_PORT)
&& checkIpPort(FAN_IP, FAN_PORT) && time != null && time != "") {
Const.SMOKE_IP = SMOKE_IP;
Const.SMOKE_PORT = Integer.parseInt(SMOKE_PORT);
Const.TEMHUM_IP = TEMHUM_IP;
Const.TEMHUM_PORT = Integer.parseInt(TEMHUM_PORT);
Const.FAN_IP = FAN_IP;
Const.FAN_PORT = Integer.parseInt(FAN_PORT);
Const.TUBE_IP = TUBE_IP;
Const.TUBE_PORT = Integer.parseInt(TUBE_PORT);
Const.BUZZER_IP = BUZZER_IP;
Const.BUZZER_PORT = Integer.parseInt(BUZZER_PORT);
Const.time = Integer.parseInt(time);
} else {
Toast.makeText(context, "配置信息不正确,请重输!", Toast.LENGTH_SHORT).show();
return;
}
window.dismiss();
}
});
}
//放入style中的。
<!-- 这个是popupwindow的代码 -->
<style name="mypopwindow_anim_style">
<item name="android:windowEnterAnimation">@anim/popshow_anim</item>
<!-- 指定显示的动画xml -->
<item name="android:windowExitAnimation">@anim/pophidden_anim</item>
<!-- 指定消失的动画xml -->
</style>
然后就是两个xml文件;popshow_anim和pophidden_anim
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromYDelta="100%p"
android:toYDelta="0" />
<alpha
android:duration="500"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
</set>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromYDelta="0"
android:toYDelta="50%p" />
<alpha
android:duration="500"
android:fromAlpha="1.0"
android:toAlpha="0.0" />
</set>
6;红点点,其实就是一个textView但是看效果图,但是用法就当时textView,通过id来使用;
来显示数字;
看代码布局;
代码;
//layout文件中。
<com.xinlan.dragindicator.DragIndicatorView
android:id="@+id/body_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="16dp"
android:background="#ff0000"
android:padding="6dp"
android:text="- -"
android:textColor="#ffffff"
android:textSize="18sp"/>
//clean_anim文件;
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<item
android:drawable="@drawable/clean_1"
android:duration="120" />
<item
android:drawable="@drawable/clean_2"
android:duration="120" />
<item
android:drawable="@drawable/clean_3"
android:duration="120" />
<item
android:drawable="@drawable/clean_4"
android:duration="120" />
<item
android:drawable="@drawable/clean_5"
android:duration="120" />
<item
android:drawable="@android:color/transparent"
android:duration="120" />
</animation-list>
//com.xinlan.dragindicator包中的是三个类
package com.xinlan.dragindicator;
import com.fro.market_peoplecalculatecase.R;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.animation.OvershootInterpolator;
import android.widget.ImageView;
import android.widget.TextView;
/**
* 可拖拽的红点提示
* <p/>
* Created by panyi on 2016/3/31.
*/
public class DragIndicatorView extends TextView {
private static int DRAW_COLOR = Color.RED;
//private static int DEFAULT_DISTANCE = 200;
private static float DEFAULT_VISCOUS_VALUE = 0.15f;//粘滞系数
private Paint mPaint;
private int mRadius = 0;
private float mViscous = DEFAULT_VISCOUS_VALUE;
private float mOriginX = 0;
private float mOriginY = 0;
private int mCenterX = 0;
private int mCenterY = 0;
private float mDx = 0;
private float mDy = 0;
//private int mDismissDetectDistance = DEFAULT_DISTANCE;//超过此距离 判定为让提示View消失
private ViewGroup mRootView;//根布局视图 作为画板使用
private DragIndicatorView mCloneView;
private ViewParent mParentView;
private SpringView mSpringView;
private OnIndicatorDismiss mOnDismissAction;
public DragIndicatorView(Context context) {
super(context);
initView(context);
}
public DragIndicatorView(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public DragIndicatorView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
public DragIndicatorView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr);
initView(context);
}
private void initView(Context context) {
setGravity(Gravity.CENTER);//内容居中
mPaint = new Paint();
mPaint.setColor(DRAW_COLOR);
mPaint.setAntiAlias(true);
if (context instanceof Activity) {
mRootView = (ViewGroup) ((Activity) context).getWindow().getDecorView();
}
//System.out.println("init View");
}
@Override
public void setBackgroundResource(int resid) {
showCannotSetBgErrorLog();
}
@Override
public void setBackground(Drawable background) {
showCannotSetBgErrorLog();
}
@Override
public void setBackgroundColor(int color) {
showCannotSetBgErrorLog();
}
private void showCannotSetBgErrorLog() {
Log.e("error", "This drag indicator view can not set custom background");
}
@Override
protected void onDraw(Canvas canvas) {
drawBackground(canvas);
super.onDraw(canvas);
}
/**
* draw circle background
*
* @param canvas
*/
private void drawBackground(Canvas canvas) {
mRadius = Math.min(getMeasuredWidth(), getMeasuredHeight()) >> 1;
canvas.drawCircle(getWidth() >> 1, getHeight() >> 1, mRadius, mPaint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//System.out.println("down");
if (mParentView == null) {
mParentView = getScrollableParent();
}
if (mParentView != null) {//屏蔽父控件的事件响应
mParentView.requestDisallowInterceptTouchEvent(true);
}
mDx = event.getX();
mDy = event.getY();
mOriginX = event.getRawX() - mDx + (getWidth() >> 1);
mOriginY = event.getRawY() - mDy + (getHeight() >> 1);
break;
case MotionEvent.ACTION_MOVE:
//System.out.println("move");
if (getVisibility() == View.VISIBLE) {
setVisibility(View.INVISIBLE);
mSpringView = new SpringView(this.getContext());
mSpringView.initSpring(mOriginX, mOriginY, mRadius, getWidth(), getHeight());
mRootView.addView(mSpringView);
mCloneView = cloneSelfView();
mRootView.addView(mCloneView, getLayoutParams());
}//end if
if (mCloneView != null) {
mCloneView.setX(event.getRawX() - mDx);
mCloneView.setY(event.getRawY() - mDy);
mCloneView.invalidate();
}
//拉伸水滴效果
if (mSpringView != null) {
//更新弹性控件
mSpringView.update(event.getRawX() - mDx, event.getRawY() - mDy);
}
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
//System.out.println("up");
//判断是否dismiss View
// if (mSpringView != null && mSpringView.radius <= 0) { //如果拖动超过会消失
if (false) {
killView(event.getRawX(), event.getRawY());
mRootView.removeView(mSpringView);
mSpringView = null;
if (mCloneView != null) {
mRootView.removeView(mCloneView);
mCloneView = null;
}
} else {//不取消
// TODO: 2016/3/31 显示回弹效果动画 恢复View可见
//setVisibility(View.VISIBLE);
if (mSpringView != null && mSpringView.spring_len > 1f) {//存在弹性势能 显示弹性动画效果
mSpringView.startSpringAction();
} else {
resetView();
}
}
if (mParentView != null) {//恢复父控件对事件的处理
mParentView.requestDisallowInterceptTouchEvent(false);
}
break;
}//end switch
return true;
}
private void resetView() {
if (mCloneView != null) {
mRootView.removeView(mCloneView);
}
if (mSpringView != null) {
mRootView.removeView(mSpringView);
}
setVisibility(View.VISIBLE);
}
/**
* 获得父控件
*
* @return
*/
private ViewGroup getScrollableParent() {
View target = this;
while (true) {
View parent;
try {
parent = (View) target.getParent();
} catch (Exception e) {
return null;
}
if (parent == null)
return null;
if (parent instanceof ViewGroup) {
return (ViewGroup) parent;
}
target = parent;
}//end while
}
/**
* 手动控制 提示按钮按钮不可见
*/
public void dismissView() {
if (getVisibility() == View.VISIBLE) {
int[] screens = new int[2];
getLocationOnScreen(screens);
killView(screens[0] + (getWidth() >> 1), screens[1] + (getHeight() >> 1));
}//end if
}
protected void killView(final float x, final float y) {
final ImageView imageView = new ImageView(getContext());
imageView.setImageResource(R.drawable.clean_anim);
mRootView.addView(imageView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
imageView.post(new Runnable() {
@Override
public void run() {
imageView.setX(x - (imageView.getMeasuredWidth() >> 1));
imageView.setY(y - (imageView.getMeasuredHeight() >> 1));
}
});
AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getDrawable();
int totalDuring = 0;
for (int i = 0, len = animationDrawable.getNumberOfFrames(); i < len; i++) {
totalDuring += animationDrawable.getDuration(i);
}
animationDrawable.start();
//动画播放结束后 移除ImageView
postDelayed(new Runnable() {
@Override
public void run() {
mRootView.removeView(imageView);
}
}, totalDuring + 20);
if (mOnDismissAction != null) {
mOnDismissAction.OnDismiss(this);
}
setVisibility(View.GONE);
}
/**
* 产生一个自己的备份
*
* @return
*/
protected DragIndicatorView cloneSelfView() {
DragIndicatorView textView = new DragIndicatorView(getContext());
textView.setText(getText());
textView.setTextColor(getTextColors());
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getTextSize());
textView.setGravity(getGravity());
textView.setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), getPaddingBottom());
textView.setEnabled(false);
return textView;
}
/**
* 获取粘滞系数
*
* @return
*/
public float getViscous() {
return mViscous;
}
/**
* 设置粘滞系数
*
* @param mViscous
*/
public void setViscous(float mViscous) {
this.mViscous = mViscous;
}
public interface OnIndicatorDismiss {
void OnDismiss(DragIndicatorView view);
}
public void setOnDismissAction(OnIndicatorDismiss mOnDismissAction) {
this.mOnDismissAction = mOnDismissAction;
}
/**
*
*/
private final class SpringView extends View {
public float from_x;
public float from_y;
public float radius;
public float to_x;
public float to_y;
public float toWidth;
public float toHeight;
private Path mPath = new Path();
boolean isSpringAction = false;
float cur_x;
float cur_y;
float spring_len = 0;
float origin_len = 0;
ValueAnimator mSpringAnimation;
public SpringView(Context context) {
super(context);
isSpringAction = false;
}
public void initSpring(float init_x, float init_y, float r, float w, float h) {
this.from_x = init_x;
this.from_y = init_y;
this.to_x = init_x;
this.to_y = init_y;
this.radius = r;
this.toWidth = w;
this.toHeight = h;
}
@Override
protected void onDraw(Canvas canvas) {
if (radius > 0) {
canvas.drawPath(mPath, mPaint);//draw path
canvas.drawCircle(from_x, from_y, radius, mPaint);
}//end if
}
public void update(float x, float y) {
this.to_x = x;
this.to_y = y;
//目的圆 球心坐标
float dest_x = to_x + toWidth / 2;
float dest_y = to_y + toHeight / 2;
updatePosition(dest_x, dest_y);
}
private void updatePosition(final float dest_x, final float dest_y) {
this.cur_x = dest_x;
this.cur_y = dest_y;
float deltaX = 0;
float deltaY = 0;
if (dest_y >= from_y) {
deltaX = dest_x - from_x;
deltaY = dest_y - from_y;
} else {
deltaX = from_x - dest_x;
deltaY = from_y - dest_y;
}//end if
float distance = (float) Math.sqrt(deltaX * deltaX + deltaY * deltaY);
//radius = (float)mRadius/(distance + 1);
// r = R - R * (1 -1/d));
radius = mRadius - mViscous * distance;
if (radius < 0.2f * mRadius) {
radius = 0;
}
if (radius > 0) {
// (1 , 0) (x,y)
double cos_delta = deltaX / distance;
double angle = Math.acos(cos_delta);
double circle_from_thela1 = angle + Math.PI / 2;
double circle_from_thela2 = circle_from_thela1 + Math.PI;
float circle_from_circle_x1 = (float) (from_x + radius * Math.cos(circle_from_thela1));
float circle_from_circle_y1 = (float) (from_y + radius * Math.sin(circle_from_thela1));
float circle_from_circle_x2 = (float) (from_x + radius * Math.cos(circle_from_thela2));
float circle_from_circle_y2 = (float) (from_y + radius * Math.sin(circle_from_thela2));
float circle_to_circle_x1 = (float) (dest_x + mRadius * Math.cos(circle_from_thela1));
float circle_to_circle_y1 = (float) (dest_y + mRadius * Math.sin(circle_from_thela1));
float circle_to_circle_x2 = (float) (dest_x + mRadius * Math.cos(circle_from_thela2));
float circle_to_circle_y2 = (float) (dest_y + mRadius * Math.sin(circle_from_thela2));
mPath.reset();
mPath.moveTo(circle_from_circle_x1, circle_from_circle_y1);
mPath.lineTo(circle_from_circle_x2, circle_from_circle_y2);
mPath.quadTo((from_x + dest_x) / 2, (from_y + dest_y) / 2,
circle_to_circle_x2, circle_to_circle_y2);
//mPath.lineTo(dest_x,dest_y);
//mPath.lineTo(circle_to_circle_x2, circle_to_circle_y2);
mPath.lineTo(circle_to_circle_x1, circle_to_circle_y1);
mPath.quadTo((from_x + dest_x) / 2, (from_y + dest_y) / 2,
circle_from_circle_x1, circle_from_circle_y1);
mPath.close();
if (mCloneView != null) {
mCloneView.setX(cur_x - toWidth / 2);
mCloneView.setY(cur_y - toHeight / 2);
}
spring_len = distance;
} else {
spring_len = 0;
}
invalidate();
}
/**
* 做回弹操作
*/
public void startSpringAction() {
isSpringAction = true;
origin_len = spring_len;
if (mSpringAnimation != null) {
mSpringAnimation.cancel();
}
mSpringAnimation = ValueAnimator.ofObject(new PointEvaluator(),
new Point(cur_x, cur_y), new Point(from_x, from_y));
mSpringAnimation.setDuration(120);
mSpringAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Point p = (Point) animation.getAnimatedValue();
updatePosition(p.getX(), p.getY());
//invalidate();
}
});
mSpringAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
resetView();
}
});
mSpringAnimation.setInterpolator(new OvershootInterpolator(5));
mSpringAnimation.start();
postInvalidate();
}
}//end inner class
}//end class
package com.xinlan.dragindicator;
/**
* Created by panyi on 16/4/5.
*/
public class Point {
private float x;
private float y;
public Point(float x, float y) {
this.x = x;
this.y = y;
}
public float getX() {
return x;
}
public float getY() {
return y;
}
}//end class
package com.xinlan.dragindicator;
import android.animation.TypeEvaluator;
/**
* Created by panyi on 16/4/5.
*
*/
public class PointEvaluator implements TypeEvaluator<Point> {
@Override
public Point evaluate(float fraction, Point startValue, Point endValue) {
float x = startValue.getX() + fraction * (endValue.getX() - startValue.getX());
float y = startValue.getY() + fraction * (endValue.getY() - startValue.getY());
Point point = new Point(x, y);
return point;
}
}//end class