1、MainActivity
package com.xpg.slider;
import com.xpg.view.SliderView;
import com.xpg.view.SliderView.SliderListener;
import android.os.Bundle;
import android.app.Activity;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
public class MainActivity extends Activity implements SliderListener{
private RelativeLayout relativeLayout ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化SliderView
relativeLayout = (RelativeLayout)findViewById(R.id.slider);
SliderView sliderView = new SliderView(this,this);
RelativeLayout.LayoutParams sliderLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
sliderLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
sliderView.setLayoutParams(sliderLayoutParams);
relativeLayout.addView(sliderView);
sliderView.setSilderListener(this);
}
@Override
public void sliderIsUp() {
// TODO Auto-generated method stub
System.out.println("实现接口!!!");
}
@Override
public void sliderIsDown() {
// TODO Auto-generated method stub
System.out.println("返回原点!!!");
}
}
2、SliderView
package com.xpg.view;
import com.xpg.slider.R;
import android.R.integer;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
public class SliderView extends View {
private Context context;
private Bitmap slipopenBtn, slipopenBg;
private float y, x, drawY,progress;//progress
public SliderListener silderListener ;
private int height,bottomMargin;//加入leftMargin变量是为了让滑块 离两边有个距离
private Handler myHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
drawY = msg.arg1;
invalidate();
super.handleMessage(msg);
}
@Override
public void dispatchMessage(Message msg) {
// TODO Auto-generated method stub
super.dispatchMessage(msg);
}
};
public SliderView(Context context) {
super(context);
this.context = context;
init();
}
public SliderView(Context context , SliderListener openlocklistener) {
super(context);
this.context = context;
this.silderListener = openlocklistener;
init();
}
public SliderView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
init();
}
public SliderView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
init();
}
private void init() {
slipopenBtn = BitmapFactory.decodeResource(getResources(),
R.drawable.hbs_home_open_tab_bg2);
slipopenBg = BitmapFactory.decodeResource(getResources(),
R.drawable.hbs_home_open_tab_bg);
height = ((Activity)context).getWindowManager().getDefaultDisplay().getHeight();
//bottomMargin = Math.round(37f/480f*height);//????
bottomMargin = slipopenBg.getHeight()/2-slipopenBtn.getHeight();
drawY = slipopenBg.getHeight()/2 -bottomMargin;//初始化drawY的初始值
progress = slipopenBg.getHeight()/2 -bottomMargin;//初始化progress的值
}
@Override
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
canvas.drawBitmap(slipopenBg, 0, 0, paint);
//canvas.drawBitmap(slipopenBtn, drawY, slipopenBg.getHeight() / 2
//- slipopenBtn.getHeight() / 2, paint);
canvas.drawBitmap(slipopenBtn, 0, drawY , paint);
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int i = 0xff & event.getAction();
switch (i) {
case 0: //
break;
case 5: //
break;
case 2: // 按住
this.y = event.getY();
this.x = event.getX();
// 按住的限制条件
if (x <= slipopenBg.getWidth()) {
if ((y <= slipopenBg.getHeight() - slipopenBtn.getHeight() / 2)
&& (drawY >= bottomMargin + bottomMargin / 2)
&& (y >= bottomMargin + slipopenBtn.getHeight() / 4)) {
drawY = y - slipopenBtn.getHeight() / 2;
}
break;
}
case 1: // 松开
if (drawY <= bottomMargin + bottomMargin/2) {
drop();
silderListener.sliderIsUp();
}
if (drawY > bottomMargin + bottomMargin / 2) {
drawY = slipopenBg.getHeight() / 2 - bottomMargin; // 没开锁,滑块重新回到初始位置
}
break;
case 6:
break;
default:
break;
}
invalidate();
return true;
}
/**
* 启动线程
*/
private void drop(){
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
motion();
}
}).start();
}
/**
* 设置动作效果
*/
private void motion(){
for (int i = 0; i
if (i==0) {//停留一段时间
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else if (i <= 70) {//这段时间缓慢下落
try {
drawY = drawY + 3;
Message msg = new Message();
msg.what = 1;
msg.arg1 = (int) drawY;
myHandler.sendMessage(msg);
Thread.sleep(12);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else if(i > 70 && i < 140){//这段时间加速
try {
drawY = drawY + 3;
Message msg = new Message();
msg.what = 1;
msg.arg1 = (int) drawY;
myHandler.sendMessage(msg);
Thread.sleep(3);
if (drawY > 175) {//这段时间加加速
drawY = slipopenBg.getHeight()/2 -bottomMargin; //没开锁 ,滑块重新回到初始位置
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
drawY = slipopenBg.getHeight()/2 -bottomMargin;
silderListener.sliderIsDown();
}
public SliderListener getSilderListener() {
return silderListener;
}
public void setSilderListener(SliderListener silderListener) {
this.silderListener = silderListener;
}
/**
* 空接口
*/
public interface SliderListener{
public void sliderIsUp();//达到最高点时触发
public void sliderIsDown();//返回原点时触发
}
}