android 音乐界面布局,播放界面布局 - Android Jamendo开源在线音乐播放器源码分析_Linux编程_Linux公社-Linux系统门户网站...

Jamendo的播放界面做的很不错,如下图:

7dc5df615d5aea588a36e11b613dc7c9.png

中间那四个按钮加入了透明度渐变动画,点击桌面会出现这四个Button

87b81cba91727cc4ec0e835ff98f4391.png

中间那个背景的下方还使用了倒影,效果看起来很不错

cc8ba02f5a8ce24c0368f147f6c7563a.png

最后就是使用了SlidingDrawer这几方面都可以学习下。

先说下那四个按钮的布局

android:layout_height="300dip"android:layout_width="300dip"

android:background="@null"android:layout_centerHorizontal="true"

android:layout_alignTop="@id/ReflectableLayout">

android:background="@null"android:src="@drawable/player_play_light"

android:layout_width="wrap_content"android:layout_height="wrap_content"

android:layout_centerHorizontal="true"android:layout_marginTop="10dip"

android:layout_alignParentTop="true"android:visibility="gone">

android:background="@null"android:src="@drawable/player_stop_light"

android:layout_width="wrap_content"android:layout_height="wrap_content"

android:layout_centerHorizontal="true"android:layout_marginBottom="10dip"

android:layout_alignParentBottom="true"android:visibility="gone">

android:background="@null"android:src="@drawable/player_next_light"

android:layout_width="wrap_content"android:layout_height="wrap_content"

android:layout_centerVertical="true"android:layout_marginRight="10dip"

android:layout_alignParentRight="true"android:visibility="gone">

android:background="@null"android:src="@drawable/player_prev_light"

android:layout_width="wrap_content"android:layout_height="wrap_content"

android:layout_centerVertical="true"android:layout_marginLeft="10dip"

android:layout_alignParentLeft="true"android:visibility="gone">

fade_in.xml  位置在Res/anmi文件夹下面,我们看到其实即使定义了动画中的alpha通过设置透明度来实现,fade_in.xml主要是从无到有的渐变过程

android:zAdjustment="bottom"android:fillAfter="false">

android:duration="400"/>

fade_out.xml 主要是从有到无的渐变过程

android:zAdjustment="bottom"android:fillAfter="false">

android:duration="400"/>

之后就是在代码中通过定义监听器

privateImageButton mPlayImageButton;

privateImageButton mNextImageButton;

privateImageButton mPrevImageButton;

privateImageButton mStopImageButton;

,.............................

privateAnimation mFadeInAnimation;

privateAnimation mFadeOutAnimation;

...............................

mFadeInAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_in);

mFadeOutAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_out);

mFadeOutAnimation.setAnimationListener(newAnimationListener(){

@Override

publicvoidonAnimationEnd(Animation animation) {

setMediaGone();

}

@Override

publicvoidonAnimationRepeat(Animation animation) {

// nothing here

}

@Override

publicvoidonAnimationStart(Animation animation) {

setFadeOutAnimation();

}

});

mFadeInAnimation.setAnimationListener(newAnimationListener(){

@Override

publicvoidonAnimationEnd(Animation animation) {

newHandler().postDelayed(newRunnable(){

@Override

publicvoidrun() {

if(mFadeInAnimation.hasEnded())//judge whether the fadeInAnimation is ended

mPlayImageButton.startAnimation(mFadeOutAnimation);

}

},7500);

}

@Override

publicvoidonAnimationRepeat(Animation animation) {

// nothing here

}

@Override

publicvoidonAnimationStart(Animation animation) {

setMediaVisible();

}

});

/**

* Makes 4-way media visible

*/

privatevoidsetMediaVisible(){

mPlayImageButton.setVisibility(View.VISIBLE);

mNextImageButton.setVisibility(View.VISIBLE);

mPrevImageButton.setVisibility(View.VISIBLE);

mStopImageButton.setVisibility(View.VISIBLE);

}

/**

* Makes 4-way media gone

*/

privatevoidsetMediaGone(){

mPlayImageButton.setVisibility(View.GONE);

mNextImageButton.setVisibility(View.GONE);

mPrevImageButton.setVisibility(View.GONE);

mStopImageButton.setVisibility(View.GONE);

}

/**

* Sets fade out animation to 4-way media

*/

privatevoidsetFadeOutAnimation(){

mPlayImageButton.setAnimation(mFadeOutAnimation);

mNextImageButton.setAnimation(mFadeOutAnimation);

mPrevImageButton.setAnimation(mFadeOutAnimation);

mStopImageButton.setAnimation(mFadeOutAnimation);

}

FadeInAnimation);

mStopImageButton.setAnimation(mFadeInAnimation);

}

/**

* Sets fade out animation to 4-way media

*/

privatevoidsetFadeInAnimation(){

mPlayImageButton.setAnimation(mFadeInAnimation);

mNextImageButton.setAnimation(mFadeInAnimation);

mPrevImageButton.setAnimation(

从以上代码中,可以看出其实使用动画的步骤其实还是很容易的:

1.定义动画xml文件,可以是透明度,移位,缩放OR 旋转等动画效果

2.调用AnimationUtils的loadAnimation方法来加载动画xml文件

mFadeInAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_in);

mFadeOutAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_out);

3.给需要动画显示效果的控件加上动画

mPlayImageButton.setAnimation(mFadeOutAnimation);

...........

下面说说布局中那个image倒影的实现:

e509a4d9a1a4de44af6b3eaf880001a5.png

代码中写了了两个自定义View,分别继承自LiearLayout和ImageView

public class ReflectableLayout extends RelativeLayout

public class ReflectiveSurface extends ImageView

其中ReflectableLayout里面存放有两个继承自ImageView的RemoteImageView

下面分析怎么实现倒影的

其实步骤很简单,只要在ReflectiveSurface里面传入经过处理变换的canvas然后调用ReflectableLayout的Ondraw方法就可以

所谓处理其实就是进行一个坐标变化然后调用scale(1f,-1f)进行绘制

具体实现代码如下:

protectedvoidonDraw(Canvas canvas) {

if(mReflectableLayout ==null){

super.onDraw(canvas);

return;

}

// reflect & copy

canvas.translate(0, mReflectableLayout.getHeight());//先把坐标点移自ReflectiveSurface画布的起点

canvas.scale(1f, -1f);//-1表示方向相反

// render

mReflectableLayout.draw(canvas);//传入经过处理的Canvas

super.onDraw(canvas);

}

protectedvoidonDraw(Canvas canvas) {

super.onDraw(canvas);//对传过来的Canvas进行绘制

if(mReflectiveImageView ==null)

return;

// We need to notify ImageView to redraw itself

mReflectiveImageView.postInvalidate();  }

这里面由于canvas的相对原点是针对要绘制的widget而言,因此,如果想在ReflectiveSurface里进行绘制,必须通过translate进行变换0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值