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);
      
    }
}

至此框架就生成了,需要自己再开发框架提供上层调用

原创粉丝点击