实现滑动解锁按钮,附带按钮滑动音效。
public class SlidingButton extends Button {
float offset;
public SlidingButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public SlidingButton(Context context) {
super(context);
}
private boolean isMe = false;
private int limit = 302;
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
public boolean isMe() {
return isMe;
}
public void setMe(boolean isMe) {
this.isMe = isMe;
}
public SlidingButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
offset = event.getX();
isMe = true;
} else if (event.getAction() == MotionEvent.ACTION_UP) {
isMe = false;
}
return false;
}
public boolean handleActivityEvent(MotionEvent activityEvent) {
boolean result = false;
if (isMe()) {
if (activityEvent.getAction() == MotionEvent.ACTION_UP) {
int newX = (int) activityEvent.getX();
if (newX < getLimit() && newX > 100) {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) getLayoutParams();
TranslateAnimation trans = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0, Animation.ABSOLUTE,
-lp.leftMargin, Animation.RELATIVE_TO_SELF, 0,
Animation.RELATIVE_TO_SELF, 0);
trans.setStartOffset(0);
trans.setDuration(500);
trans.setFillBefore(true);
trans.setAnimationListener(new SlidingAnimationListener(
this));
startAnimation(trans);
} else if (newX > getLimit()) {
//SoundPlayer.getInstance().play(SoundPlayer.SLIDE);
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) getLayoutParams();
lp.leftMargin = 0;
setLayoutParams(lp);
isMe = false;
//用户完成了选择动作
result = true;
}
} else {
// 还在拖动
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) getLayoutParams();
lp.leftMargin = (int) (activityEvent.getX() - offset-5);
System.out.println(lp.leftMargin);
if (lp.leftMargin > 0 && lp.leftMargin < (367-149)) {
setLayoutParams(lp);
}
}
}
return result;
}
private static class SlidingAnimationListener implements AnimationListener {
private SlidingButton but;
public SlidingAnimationListener(SlidingButton button) {
this.but = button;
}
@Override
public void onAnimationEnd(Animation animation) {
rePosition();
but.setMe(false);
}
private void rePosition() {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) but
.getLayoutParams();
lp.leftMargin = 0;
but.setLayoutParams(lp);
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
}
}
public class SoundPlayer {
public static int BTN;
public static int LOOP;
private SoundPool soundPool;
private int loopStreamId;
private static SoundPlayer instance;
public static SoundPlayer getInstance() {
synchronized (SoundPlayer.class) {
if (instance == null) {
instance = new SoundPlayer();
}
}
return instance;
}
// 单例
private SoundPlayer() {
soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
}
public void loadSound(Context context) {
BTN = soundPool.load(context, R.raw.button, 1);
LOOP = soundPool.load(context, R.raw.loop, 1);
}
public void play(int soundId) {
if (soundId == LOOP) {
// 循环播放
soundPool.stop(loopStreamId);
loopStreamId = soundPool.play(soundId, 1f, 1f, 1, -1, 1f);
} else {
// 只播放一次
soundPool.play(soundId, 1f, 1f, 1, 0, 1f);
}
}
public void stop() {
soundPool.stop(loopStreamId);
}
}
分享到:
相关推荐
通过使用QPainter,我们可以自定义滑动按钮的外观,包括滑块、轨道以及滑动时的动画效果。 创建自定义滑动按钮的第一步是定义一个新的QWidget子类,比如叫做CustomSlider。在这个类中,我们需要重写paintEvent()...
在Android开发中,为了提供与iOS设备类似的用户体验,开发者经常需要实现特定的UI元素,例如Iphone上的滑动按钮(SlipButton)。本教程将详细讲解如何在Android中创建一个仿照iPhone风格的滑动按钮,并探讨其核心原理...
滑动按钮和滑动锁是Android应用开发中常见的交互元素,它们通常用于用户验证或确认操作,例如解锁屏幕、开启/关闭功能等。本压缩包提供的"滑动按钮,滑动锁的实现(已封装好,可直接使用)"是一个预封装的Android...
- 布局文件:在XML布局中添加自定义的滑动按钮或滑动锁组件,设置相关属性,如初始状态、颜色、大小等。 - 代码逻辑:在Activity或Fragment中获取组件实例,设置监听器以响应状态变化,进行业务逻辑处理。 5. **...
-- 滑动解锁控件 xml配置属性 --> <attr name=slideImageViewWidth format=dimension/><!-- 滑块宽度 --> <attr name=slideImageViewResId format=reference/><!-- 滑块资源id --> <attr name...
在iOS开发中,滑动解锁是一种常见的用户交互方式,它为用户提供了一种直观且安全的设备解锁体验。本文将深入探讨“ios滑动解锁”这一技术,并基于提供的SlideViewDemo源码进行解析。 首先,我们要了解滑动解锁的...
- 在Android中,滑动按钮通常需要自定义一个View来实现。自定义View需要继承自`View`或者`LinearLayout`等基础视图类,并重写`onDraw()`方法绘制界面,以及`onTouchEvent()`处理触摸事件。 2. **手势识别**: - ...
在Android开发领域,滑动按钮和滑动锁是常见的交互元素,它们被广泛应用于各种应用程序,如设置开关、确认操作等。本项目提供了100套Android项目的源码,其中包括了滑动按钮和滑动锁的实现,这些源码已经过封装,...
5. **封装与复用**:为了提高代码的可重用性和可维护性,将滑动按钮或滑动锁的实现封装成一个自定义View类是明智的选择。这样,可以在多个地方直接使用这个组件,而无需重复编写相同代码。 在提供的"android滑动...
封装好的控件通常包含了一套完整的属性和方法,开发者可以通过修改这些属性和调用相应的方法来实现不同的功能,例如自定义滑动按钮的颜色、大小、响应事件等。 在实际开发中,开发者可能需要根据具体的应用场景和...
- 提供接口,允许开发者自定义解锁成功或失败的回调。 这个已封装好的滑动锁组件,大大简化了Android开发者在项目中实现滑动验证的功能,只需简单集成和配置即可,提高了开发效率。通过深入理解其工作原理和代码...
- 滑动锁(Slide Lock):类似于滑动按钮,但通常设计为更长,用户需要滑动一段距离才能解锁,常用于保护隐私或安全设置。 2. **滑动组件的实现原理** - 在Android中,滑动按钮和滑动锁通常基于`SeekBar`或者...