哦,,我真是消失的够久了,,,这个学期在做大作业的过程中其实着实遇到了些问题,只不过,因为忙着做作业呀,还有一些其他什么的一直没有总结,,,今天的主要任务完成的差不多,又想起可以来更一下了。今天主要总结下自己做安卓手游的一些菜鸟问题。
1、有关放图
这真是基础的不能再基础的问题了。
放图的方式主要两种,一种用Bitmap,一种用ImageView。就我个人经验来讲,我认为ImageView呢主要是在Activity里面进行使用(就是说代码直接写在Activity里面的意思,我很菜嘛,所以用语可能不规范,请多包涵哈~),也有自己写一个继承ImageView的类的情况,最简单的放图就是用ImageView加载一张图片:
1>在界面XML文件中添加一个ImageView1
2>在Activity代码中声明一个ImageView,ID指向ImageView1的ID,这个ID可以根据需要进行修改
ImageView title = (ImageView) findViewById(R.id.title);
就个人经验之谈,↑这个语句不能写到自定义类中。
3>加载图片
title.setImageResource(R.drawable.title);
Bitmap实际上是绘制在画布上的,它只起到加载图片的作用,也就是说首先你需要有一个画布:
1>准备工作:
Canvas mCanvas;
Bitmap blackbitmap;
2>加载图片:
blackbitmap= BitmapFactory.decodeResource(res, R.drawable.black);
3>绘制:
mCanvas.drawBitmap(blackbitmap,x, y, true);
Bitmap的绘制方法有很多,这是最简单的,用坐标进行绘制
其他常用绘制方法列举:
1>使用rect
就是先定义一个矩形,将Bitmap绘制在这个矩形范围内。
RectF rect = new RectF();//绘制范围
rect.set(x,y,x+50,y+50);
canvas.drawBitmap(bitmap, null, rect,null);
需要注意的是,rect.set(float x,float y,float x2,float y2),这四个参数可以这样理解:
你所定义的矩形左上角点为(x,y)右下角点为(x2,y2)
没错,就是这样,和我们的常规理解不太一样。
2>使用Matrix进行变换:
Matrix是一个功能强大的类,可以进行平移、旋转、缩放、倒影等多种变换,详情可百度,这里只做列举和一些我应用到的提示(关于旋转):
还是要定义一个Matrix
// 实现图像旋转
Matrix mat = new Matrix();
Paint _mPaint = new Paint();//画笔
_mPaint.setColor(Color.WHITE);//设置画笔颜色
mat.reset();
mat.setTranslate(675,329);//图片位置,坐标
mat.preRotate(-_decDegree,(float)arrow.getWidth()/2,((float)arrow.getHeight()*4)/5);
canvas.drawBitmap(arrow, mat, _mPaint);
这里需要重!点!提一下的就是.preRotate()方法!!!
表示我在实际操作中被网上的一些教程坑了,,,
preRotate()中第一个参数就是你要旋转的角度,第二第三个参数可以没有,有的话用来表示旋转中心。重点就是在旋转中心这里,它使用的比不是我们下意识认为的屏幕坐标,而是相对图片本身的位置,即你要是想绕图片自身中心旋转90度就这样写:
Mat.preRotate(90,(float)arrow.getWidth()/2,(float)arrow.getHeight()/2);
↑应该表示的很清楚了吧?大家那么棒我就不赘述了,。(づ ̄ 3 ̄)づ
2、有关音频加载
音频加载的两种方式大家都应该从网上找到了很多资料,MediaPlayer和SoundPool,两种都可以用,用法也没有教程上那么复杂,需要注意的就是SoundPool只能加载7秒以下音频,多了就容易出错了。
网络上关于使用MediaPlayer的用法大多提倡使用Service,它的明显优点就是前台后台互不干涉,你操作你的,并不能影响我的音乐播放←这样。但是有些需要语音剧情的情况下(原谅我并不知道其他好的解决办法,欢迎指正)还是需要MediaPlayer对一些操作作出反馈,这样的话就直接用就可以了。下面是我写的一个非常简单的继承MediaPlayer的类:
/**
* Created by lenovo on 2016/5/24.
*/
public class opera {
MediaPlayer m1;
int Id;
Context mcontext;
int end=1;
public opera(int id,Context c){
this.Id=id;//加载的音乐文件ID
this.mcontext=c;
}
public void initmedia(){
this.m1=MediaPlayer.create(this.mcontext,this.Id);
}
public void playmedia(){
if(end==1){
this.m1.start();
Log.i("tag", "音乐开始播放");
}
else
Log.i("tag","出错");
}
public void destroymedia(){
int juge=1;
this.m1.setOnCompletionListener(newMediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Log.d("tag", "播放完毕");
mp.stop();
Log.d("tag", "停止");
mp.release();
mp.reset();
Log.i("tag", "销毁成功");
}
});
/*
上面这部分代码是用来判断音乐播放结束并销毁的,因为就我个人实际测试经验,MediaPlayer会自动循环你加载的音乐,而且每次循环会有一定的间隔,需要你在音乐播放结束的时候及时的终止。
*/
this.end=juge;
}
public void destroy(){
this.m1.release();
this.m1=null;
Log.i("tag", "销毁");
}
它的调用:
opera op1=new opera(R.raw.scene1,this);
op1.initmedia();
op1.playmedia();
op1.destroymedia();
需要注意的是,最后一定要进行销毁,不然的话你的音乐会一直运行下去。
今天就先到这里吧,,,,还有好多想要总结的都没有写出来_(:з」∠)_,有关于surfaceView,有关于触摸事件,,,,,已经熄灯了,我就洗洗睡了,明天还有课,,,
由于UP个人能力所限,能为大家提供的东西也有限,如果各位大大有什么更好的处理方法,欢迎指正~←此宣言时效永久~
最后祝大家学业顺利~(づ ̄ 3 ̄)づ