掉音乐符背景界面(仿飘雪花)

         经常看到一些大神讲诉自己的强者之路,为了向大神们学习,我也学着开始我的博客之旅,这是我的第一篇博客,本人能力有限,仅供初学者观看,大神勿喷。

      最近碰到一项目,要去一个音乐播放功能(音乐功能下篇结合这个音乐背景再讲,现在先上音乐背景小例子),要求背景要掉音乐符的动态图,然后网上查资料写了这么一个例子(不是帧动画),这就为讲讲我写的例子吧

      源码下载地址http://download.csdn.net/detail/u012303938/8353621

      

      先写一个自定义View

package com.example.musicimg;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import android.R.integer;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;


public class MusicView extends View{
//判断是否第一次执行ondraw
private boolean flag=false;
//有8个音乐符在掉
private static final int MUSIC_COUNT=8;
//音乐图片
private Bitmap mBitmap;
// 随即生成器
private static final Random random = new Random();
// 画笔
private final Paint mPaint = new Paint();
// 屏幕的高度和宽度(用于设置音乐符的位置)
private int view_height = 0;
private int view_width = 0;
//音乐符最大掉的速度
private int MAX_SPEED = 30;
    //存取音乐符的坐标
private ArrayList<Map<String, Integer>> list=new ArrayList<Map<String,Integer>>();


public MusicView(Context context) {
super(context);
}


public MusicView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
//得到音乐符图片并设置屏幕的宽高
public void loadMusicImg(int height, int width){
Resources r = this.getContext().getResources();
mBitmap = ((BitmapDrawable) r.getDrawable(R.drawable.snow))
.getBitmap();
view_height=height;
view_width=width;
}
//设置每个music的随机位置并封装起来
public void setMusicRandom(){
Map<String, Integer> map=null;
for(int i=0;i<MUSIC_COUNT;i++){
map=new HashMap<String, Integer>();
//坐标x位置
map.put("imgX", random.nextInt(view_width-20));
//坐标y位置
map.put("imgY", 0);
//坐标y下落的位置
int speed=random.nextInt(MAX_SPEED);
while(speed<8){
speed=random.nextInt(MAX_SPEED);
}
map.put("speed", speed);
list.add(map);
}
}


@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
if(flag){
Map<String, Integer> map=null;
for(int i=0;i<MUSIC_COUNT;i++){
if(list!=null){
Bitmap resizeBmp=null;
int imgX=list.get(i).get("imgX");
int imgY=list.get(i).get("imgY");
int imgSpeed=list.get(i).get("speed");
if(imgX>=view_width||imgY>=view_height){
imgX=random.nextInt(view_width);
imgY=-1;
}
imgY+=imgSpeed;
list.remove(i);
map=new HashMap<String, Integer>();
map.put("imgX", imgX);
map.put("imgY", imgY);
map.put("speed", imgSpeed);
list.add(i, map);
Log.i("values", "msg:"+imgY);
//画笔风格空心
mPaint.setStyle(Paint.Style.STROKE);
if(mBitmap!=null){
if(i==0){
//画笔透明度
mPaint.setAlpha(40);
//矩阵 设置图片大小
Matrix matrix = new Matrix(); 
matrix.postScale(0.8f,0.8f);
resizeBmp=Bitmap.createBitmap(mBitmap,0,0,mBitmap.getWidth(),mBitmap.getHeight(),matrix,true);
}
if(i==1){
mPaint.setAlpha(80);
Matrix matrix = new Matrix(); 
matrix.postScale(0.6f,0.6f);
resizeBmp=Bitmap.createBitmap(mBitmap,0,0,mBitmap.getWidth(),mBitmap.getHeight(),matrix,true);
}
if(i==2){
mPaint.setAlpha(120);
Matrix matrix = new Matrix(); 
matrix.postScale(0.7f,0.7f);
resizeBmp=Bitmap.createBitmap(mBitmap,0,0,mBitmap.getWidth(),mBitmap.getHeight(),matrix,true);
}
if(i==3){
mPaint.setAlpha(140);
Matrix matrix = new Matrix(); 
matrix.postScale(1.2f,1.2f);
resizeBmp=Bitmap.createBitmap(mBitmap,0,0,mBitmap.getWidth(),mBitmap.getHeight(),matrix,true);
}
if(i==4){
mPaint.setAlpha(180);
Matrix matrix = new Matrix(); 
matrix.postScale(0.5f,0.5f);
resizeBmp=Bitmap.createBitmap(mBitmap,0,0,mBitmap.getWidth(),mBitmap.getHeight(),matrix,true);
}
if(i==5){
mPaint.setAlpha(200);
Matrix matrix = new Matrix(); 
matrix.postScale(1.1f,1.1f);
resizeBmp=Bitmap.createBitmap(mBitmap,0,0,mBitmap.getWidth(),mBitmap.getHeight(),matrix,true);
}
if(i==6){
mPaint.setAlpha(210);
Matrix matrix = new Matrix(); 
matrix.postScale(0.9f,0.9f);
resizeBmp=Bitmap.createBitmap(mBitmap,0,0,mBitmap.getWidth(),mBitmap.getHeight(),matrix,true);
}
if(i==7){
mPaint.setAlpha(160);
Matrix matrix = new Matrix(); 
matrix.postScale(0.4f,0.4f);
resizeBmp=Bitmap.createBitmap(mBitmap,0,0,mBitmap.getWidth(),mBitmap.getHeight(),matrix,true);
}
//在画布上执行
canvas.drawBitmap(resizeBmp, imgX,
imgY, mPaint);
}
}
}
}else{
flag=true;
}
}


}

   主程序调用自定义View

package com.example.musicimg;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.util.DisplayMetrics;
import android.view.Menu;
import android.view.Window;


public class MainActivity extends Activity {
private MusicView mMusicView;
//开启一个定时器  不停的更新onDraw方法
private Handler mHandler=new Handler(){
public void handleMessage(Message msg) {
mMusicView.invalidate();
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), 100);
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去掉标题头部
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
setUpView();
}

private void setUpView() {
// TODO Auto-generated method stub
mMusicView=(MusicView) findViewById(R.id.music);
// 获取当前屏幕的高和宽
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
//加载图片并设置屏幕宽高
mMusicView.loadMusicImg(dm.heightPixels, dm.widthPixels);
   //设置图片初始的位置
mMusicView.setMusicRandom();
//发信息
   Message message=new Message();
   message.what=0;
   mHandler.sendMessageDelayed(message, 600);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}


}


   最后上xml布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/song"
    tools:context=".MainActivity" >

    <com.example.musicimg.MusicView
        android:id="@+id/music"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
         />

</RelativeLayout>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值