安卓——关于一些ui界面设置(直续更新ing)

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值