android 歌曲名称旋转 框架
来源:互联网 发布:linux top 某个进程 编辑:程序博客网 时间:2024/05/28 19:24
android 歌曲名称旋转 框架
之前写过一个音乐播放器,很简单的那种,列表,按钮等等基于控件的界面
当然自己在里面增加了许多小功能
计算器,还有
俄罗斯方块,还有
联网查看图片等等
其实这是后来又回归简洁风格了,之前也做过优化的界面
像这样
不过还是觉得有点太简单了,然后又学了下关于canvas和surfaceview的一点知识,做了一个可以旋转歌曲名称的界面
大概长这个样子
好了直接上代码
<?xml version="1.0" encoding="UTF-8"?>
-<LinearLayout android:orientation="vertical" android:layout_height="match_parent" android:layout_width="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android">
<xdtech.lovelessing.TiltView android:layout_height="100dp" android:layout_width="match_parent" app:type="1" app:srcCompat="@drawable/a" android:id="@+id/pic1"/>
<xdtech.lovelessing.TiltView android:layout_height="100dp" android:layout_width="match_parent" app:type="2" app:srcCompat="@drawable/b" android:id="@+id/pic2"/>
<xdtech.lovelessing.TiltView android:layout_height="100dp" android:layout_width="match_parent" app:type="4" app:srcCompat="@drawable/c" android:id="@+id/pic3"/>
</LinearLayout>
这就是主界面的布局了,整屏的surfaview
接着
package xdtech.lovelessing;
/**
* Created by Administrator on 2017/8/6.
*/
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;
public class MyMusicView extends SurfaceView implements Callback, Runnable {
private boolean runflag=false;
private boolean playflag=false;
private SurfaceHolder sfh;
private Paint paint;
private Thread th;
private Canvas canvas;
private int screenW, screenH;
private float angle = 0;
public long run_time;
private int second_time;
private boolean second_flag = false;
public MyMusicView(Context context) {
super(context);
sfh = this.getHolder();
sfh.addCallback(this);
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);
setFocusable(true);
}
public void surfaceCreated(SurfaceHolder holder) {
screenW = this.getWidth();
screenH = this.getHeight();
runflag = true;
th = new Thread(this);//实例线程
th.start();//启动线程
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return true;
}
public void drawFrame(int currentFrame, Canvas canvas, Paint paint) {
canvas.drawColor(Color.BLACK);
paint.setColor(Color.WHITE);
//paint.setTypeface(Typeface.MONOSPACE);
paint.setTextSize(42);
int len = 12;float val=0;
//canvas.save();
canvas.drawText("上一曲",len,screenH-paint.getTextSize()-len,paint);
if (playflag)
{
canvas.drawText("暂停",len+paint.getTextSize()*4,screenH-paint.getTextSize()-len,paint);
}
else
{
canvas.drawText("播放",len+paint.getTextSize()*4,screenH-paint.getTextSize()-len,paint);
}
canvas.drawText("下一曲",len+paint.getTextSize()*7,screenH-paint.getTextSize()-len,paint);
canvas.drawText("M A G I C",screenW-paint.getTextSize()*5-len,screenH-paint.getTextSize()*2-len*2,paint);
canvas.drawText(" A R E A ",screenW-paint.getTextSize()*5-len,screenH-paint.getTextSize(),paint);
canvas.drawText("选歌",len,screenH-paint.getTextSize()*4+len*2,paint);//起始X:len*2,结束:len*2+"选歌".length()*paint.getTextSize(),Y:7/8:1/8
String timestr = second_time/60 >=10 ? "": "0",timestrr = second_time%60 >= 10 ? "":"0";
canvas.drawText(timestr+second_time/60+":"+timestrr+second_time%60,len,screenH-paint.getTextSize()*5-len,paint);
canvas.drawText(timestr+second_time/60+":"+timestrr+second_time%60,screenW-paint.getTextSize()*3,screenH-paint.getTextSize()*5-len,paint);
val = screenW-(" 00:00 ".length()*paint.getTextSize()+len);
// canvas.drawLine((screenW - val)/2,screenH-paint.getTextSize()*5-len-(paint.getTextSize()*3)/8,(screenW - val)/2+val,
// screenH-paint.getTextSize()*5-len-(paint.getTextSize()*3)/8,paint);
canvas.drawLine((screenW - val)/2,screenH-paint.getTextSize()*5-len-(paint.getTextSize()*3)/8-4,
(screenW - val)/2+val, screenH-paint.getTextSize()*5-len-(paint.getTextSize()*3)/8-4,paint);
canvas.drawLine((screenW - val)/2,screenH-paint.getTextSize()*5-len-(paint.getTextSize()*3)/8+4,
(screenW - val)/2+val, screenH-paint.getTextSize()*5-len-(paint.getTextSize()*3)/8+4,paint);
canvas.drawLine((screenW - val)/2,screenH-paint.getTextSize()*5-len-(paint.getTextSize()*3)/8-6,
(screenW - val)/2,screenH-paint.getTextSize()*5-len-(paint.getTextSize()*3)/8+4,paint);
canvas.drawLine((screenW - val)/2+val, screenH-paint.getTextSize()*5-len-(paint.getTextSize()*3)/8-4,
(screenW - val)/2+val, screenH-paint.getTextSize()*5-len-(paint.getTextSize()*3)/8+6,paint);
canvas.drawCircle((screenW - val)/2+(val)*angle/360,screenH-paint.getTextSize()*5-len-(paint.getTextSize()*3)/8,12,paint);
drawText(canvas,"么么哒萌萌哒的亲爱哒",360,420,paint,angle,1);
//draw_bitmap(canvas,paint);
}
public void draw_bitmap(Canvas canvas,Paint paint)
{
Bitmap source = BitmapFactory.decodeResource(getResources(), R.drawable.g);
Bitmap result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
canvas = new Canvas(result);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
RectF rect = new RectF(0,0,source.getWidth(),source.getHeight());
float radius = 25.0f;
paint.setColor(Color.BLACK);
canvas.drawRoundRect(rect, radius, radius, paint);
//用转换模式转化并绘制原图
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(source, 0, 0, paint);
}
public void drawText(Canvas canvas ,String text , float x ,float y,Paint paint ,float angle,int mode)
{
paint.setTextSize(36);
if (mode == 1)
{
paint.setColor(Color.RED);
}else{
paint.setColor(Color.BLACK);
}
float half = text.length()/2*paint.getTextSize();
if(angle != 0){
canvas.rotate(angle, x, y-12);
}
canvas.drawText(text, screenW/2-half, y, paint);
if(angle != 0){
canvas.rotate(-angle,x+half, y-12);
}
}
public void myDraw() {
try {
canvas = sfh.lockCanvas();
if (canvas != null) {
drawFrame(0, canvas, paint);
}
} catch (Exception e) {
// TODO: handle exception
} finally {
if (canvas != null)
sfh.unlockCanvasAndPost(canvas);
}
}
public void logic()
{
angle+=1.0f;
if (angle>=360)
{
angle=0.0f;
}
if (run_time%20 == 0)
{
second_flag = true;
second_time++;
}
run_time++;
}
@Override
public void run() {
while (runflag) {
long start = System.currentTimeMillis();
myDraw();
logic();
long end = System.currentTimeMillis();
try {
if (end - start < 50) {
Thread.sleep(50 - (end - start));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* SurfaceView视图状态发生改变,响应此函数
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
/**
* SurfaceView视图消亡时,响应此函数
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
runflag=false;
}
}
然后在主Activity里面设置这个view
package xdtech.lovelessing;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
public class MainActivity extends Activity {
private MyMusicView myMusicView;
private Mybroad mybroad;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myMusicView = new MyMusicView(this);
setContentView(myMusicView);
}
}
至此框架就生成了,需要自己再开发框架提供上层调用
- android 歌曲名称旋转 框架
- android下歌曲名称乱码的解决办法
- Android 音乐播放器控件的歌曲名称实现滚动显示的效果
- [VBS]批量转换歌曲名称
- android 视频编辑框架(分割,裁剪,旋转,合并,添加logo,背景音乐等等)
- android 屏幕旋转v
- 如何旋转Android Emulator
- Android bitmap位图旋转
- android 屏幕旋转
- android 旋转模拟器
- android屏幕旋转
- Android图片旋转
- Android-Gsensor屏幕旋转
- android 图片旋转
- Android 屏幕旋转
- Android 动画旋转效果
- Android 屏幕旋转
- android旋转图片
- FreeSWITCH源码分析之主函数main()
- mysql性能分析之explain的用法
- LCD显示文字的函数-ARM体系-2440
- unity读取本地硬盘照片
- POJ
- android 歌曲名称旋转 框架
- 第七章 图(最短路径之dijkstra、 bellman-ford、floyd算法)
- nefu118 n!后面有多少个0(数学)
- Android SDK Manager 目录文件下载
- maven的依赖管理
- SPOJ
- java:流编程 组合流使用 总结
- ScrollView
- 贝塞尔曲线