Android为TV端助力:自定义view之太阳

先看效果图


package com.hhzt.iptv.lvb_w8.view;

import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PixelFormat;import android.graphics.PorterDuff;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;

/** * 自定义灯光选择View * * @author Chuwe1 */public class LightView extends SurfaceView implements SurfaceHolder.Callback, Runnable {

// 默认半径    private static final int DEFAULT_RADIUS = 170;

private SurfaceHolder mHolder;    private Canvas mCanvas;    private boolean flag;    /**     * 当前进度     */    private int mCurrentCount = 0;

// 圆和刻度的画笔    private Paint mPaint;    // 指针画笔    private Paint mPointerPaint;

// 画布的宽高    private int mCanvasWidth, mCanvasHeight;    // 时钟半径    private int mRadius = DEFAULT_RADIUS;

public LightView(Context context) {        this(context, null);    }

public LightView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }

public LightView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);

mHolder = getHolder();        mHolder.addCallback(this);

mPaint = new Paint();        mPointerPaint = new Paint();

mPaint.setColor(Color.WHITE);        mPaint.setAntiAlias(true); // 消除锯齿        mPaint.setStrokeWidth(10); // 设置圆环的宽度        mPaint.setStrokeCap(Paint.Cap.ROUND); // 定义线段断电形状为圆头        mPaint.setAntiAlias(true); // 消除锯齿

mPointerPaint.setColor(Color.BLACK);        mPointerPaint.setAntiAlias(true);        mPointerPaint.setStyle(Paint.Style.FILL_AND_STROKE);        mPointerPaint.setTextSize(22);        mPointerPaint.setTextAlign(Paint.Align.CENTER);

setZOrderOnTop(true);        getHolder().setFormat(PixelFormat.TRANSLUCENT);

setFocusable(true);        setFocusableInTouchMode(true);    }

@Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

int widthSize = MeasureSpec.getSize(widthMeasureSpec);        int widthMode = MeasureSpec.getMode(widthMeasureSpec);        int heightSize = MeasureSpec.getSize(heightMeasureSpec);        int heightMode = MeasureSpec.getMode(heightMeasureSpec);

int desiredWidth, desiredHeight;        if (widthMode == MeasureSpec.EXACTLY) {            desiredWidth = widthSize;        } else {            desiredWidth = mRadius * 2 + getPaddingLeft() + getPaddingRight();            if (widthMode == MeasureSpec.AT_MOST) {                desiredWidth = Math.min(widthSize, desiredWidth);            }        }

if (heightMode == MeasureSpec.EXACTLY) {            desiredHeight = heightSize;        } else {            desiredHeight = mRadius * 2 + getPaddingTop() + getPaddingBottom();            if (heightMode == MeasureSpec.AT_MOST) {                desiredHeight = Math.min(heightSize, desiredHeight);            }        }

// +4是为了设置默认的2px的内边距,因为绘制时钟的圆的画笔设置的宽度是2px        setMeasuredDimension(mCanvasWidth = desiredWidth + 20, mCanvasHeight = desiredHeight + 20);

mRadius = (int) (Math.min(desiredWidth - getPaddingLeft() - getPaddingRight(),                desiredHeight - getPaddingTop() - getPaddingBottom()) * 1.0f / 2);    }

@Override    public void surfaceCreated(SurfaceHolder holder) {        flag = true;        new Thread(this).start();    }

@Override    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {    }

@Override    public void surfaceDestroyed(SurfaceHolder holder) {        flag = false;    }

@Override    public void run() {        draw();    }

private Handler handler = new Handler(new Handler.Callback() {        @Override        public boolean handleMessage(Message msg) {            return false;        }    });

/**     * 绘制     */    private void draw() {        try {            mCanvas = mHolder.lockCanvas();            if (mCanvas != null) {                //去掉背景颜色,使其透明                mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);

mPaint.setColor(Color.WHITE);                //将坐标系原点移至去除内边距后的画布中心                mCanvas.translate(mCanvasWidth * 1.0f / 2 + getPaddingLeft() - getPaddingRight(),                        mCanvasHeight * 1.0f / 2 + getPaddingTop() - getPaddingBottom());                //绘制圆盘                mCanvas.drawCircle(0, 0, mRadius-30, mPaint);                mPaint.setColor(Color.WHITE);                //绘制时刻度                for (int i = 0; i < 10; i++) {                    mCanvas.drawLine(0, mRadius, 0, mRadius - 10, mPaint);                    mCanvas.rotate(36);                }                mPaint.setColor(Color.parseColor("#FEF37A"));                //绘制时刻度                for (int i = 0; i < mCurrentCount; i++) {                    mCanvas.drawLine(0, -mRadius, 0, -(mRadius - 10), mPaint);                    mCanvas.rotate(36);                }            }        } catch (Exception e) {            e.printStackTrace();        } finally {            if (mCanvas != null) {                mHolder.unlockCanvasAndPost(mCanvas);            }        }    }

public void setCurrentCount(int count){        this.mCurrentCount = count;        invalidate();    }

@Override    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {        super.onLayout(changed, left, top, right, bottom);        this.setBackgroundColor(Color.TRANSPARENT);    }

}

原文地址:https://www.cnblogs.com/xiaoxiaing/p/9052918.html

时间: 2024-08-30 13:37:02

Android为TV端助力:自定义view之太阳的相关文章

Android为TV端助力 listview与recyclerview上下联动

首先是主布局fragment里面的xml文件 <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/a

Android为TV端助力之解决setOnItemSelectedListener一进来就自动执行一次的问题

我们经常会遇到listview或者其他view设置setOnItemSelectedListener监听时,一加载界面,setOnItemSelectedListener监听就会自动执行一遍,导致你第一次移动上去的时候setOnItemSelectedListener监听就不会走的 所以我们采用自定义listview,主动来调用setOnItemSelectedListener监听回调,代码如下 public class MyListView extends ListView { private

Android为TV端助力 外挂字幕(设置颜色,大小,位置,微调字幕)

前提摘要:  可以给电影加字幕,目前支持srt和ass格式, 功能摘要:  支持微调字幕,设置大小,颜色,位置 1 .字幕解析类 package com.hhzt.iptv.lvb_x.utils; import android.os.Handler;import android.util.Log; import com.hhzt.iptv.lvb_x.Constant;import com.hhzt.iptv.lvb_x.log.LogUtil;import com.hhzt.iptv.lvb

Android为TV端助力 Linux命令查看包名类名

先运行apk 再输入logcat | grep START 查看当前启动apk的包名和类名 adb shell "pm list packages -f | grep com.yulong.android.launcher3" adb shell "pm list packages -f | grep com."显示包名的apk名称 原文地址:https://www.cnblogs.com/xiaoxiaing/p/8241873.html

Android为TV端助力:(转载)修改TextView字体样式

一.开篇 因为 Android 字体相关的内容还比较多的.有时候其实我们只需要调整一下属性就可以满足设计师的需求,或者是一个退后的方案(毕竟有发版的时间卡住了),有一些效果可以大概满足需求. 那么本文就先介绍一下再 Android 下原生内置的一些字体的一些基本概念和使用. 需要注意的是,内置的一些字体只对英文有效. 二.Android 的默认字体 Android 系统默认使用的是一款叫做 Robote 的字体.Robote 本身就是 Google 自己的字体格式,Android 和 Chrom

Android为TV端助力 使用shared注意事项

不要存放大的key和value!我就不重复三遍了,会引起界面卡.频繁GC.占用内存等等,好自为之! 毫不相关的配置项就不要丢在一起了!文件越大读取越慢,不知不觉就被猪队友给坑了:蓝后,放进defalut的那个简直就是愚蠢行为! 读取频繁的key和不易变动的key尽量不要放在一起,影响速度.(如果整个文件很小,那么忽略吧,为了这点性能添加维护成本得不偿失) 不要乱edit和apply,尽量批量修改一次提交! 尽量不要存放JSON和HTML,这种场景请直接使用json! 不要指望用这货进行跨进程通信

Android中实现Bitmap在自定义View中的放大与拖动

一:基本实现思路 基于View类实现自定义View –MyImageView类.在使用View的Activity类中完成OnTouchListener接口,实现对自定义View的触摸事件监听 放大与拖动 基于单点触控实现Bitmap对象在View上的拖动.并且检测View的边缘,防止拖动过界.基于两个点触控实现Bitmap对象在View上的放大.并且检测放大倍数.基于Matrix对象实现对Bitmap在View上放大与平移变换 Bitmap对象在View中的更新与显示 通过重载onDraw方法,

Android软件开发之盘点自定义View界面大合集(二)

Android软件开发之盘点自定义View界面大合集(二) - 雨松MOMO的程序世界 - 51CTO技术博客 雨松MOMO带大家盘点Android 中的自定义View界面的绘制 今天我用自己写的一个Demo 和大家详细介绍一个Android中自定义View中的使用与绘制技巧. 1.自定义view绘制字符串 相信在实际开发过程中必然很多地方都须要用到系统字 为什么会用到系统字? 方便 省内存 我相信做过J2ME游戏开发的朋友应该深知内存有多么多么重要 而且使用它还可以带来一个更重要的好处就是很方

Android初级教程初谈自定义view自定义属性

有些时候,自己要在布局文件中重复书写大量的代码来定义一个布局.这是最基本的使用,当然要掌握:但是有些场景都去对应的布局里面写对应的属性,就显得很无力.会发现,系统自带的控件无法满足我们的要求,这个时候就要考虑自定义控件.自定义view的世界,也很浩瀚,个人需要学的地方还有很多很多.自定义view,会节省开发效率,很有必要学习其基本原理和方法.接下来就对自定义view,做一个初步的认识,一步步了解封装的重要性.但是,也仅仅是一个初步,因为它实在太灵活了. 有这么一种场景,看图: 除了布局之外,还有