zoukankan      html  css  js  c++  java
  • 自绘制View---------左右滑动刻度调频View

    代码中使用自定义View:

    private SeekView mSeekView = null;
    ......
    mSeekView = new SeekView(this, mHandler);
    RelativeLayout rela = (RelativeLayout)findViewById(R.id.seek_part);
    rela.addView(mSeekView);

    重写View如下:

    package com.mediatek.fmradio;
    
    import java.util.StringTokenizer;
    
    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.content.res.Resources;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.LinearGradient;
    import android.graphics.Matrix;
    import android.graphics.Paint;
    import android.graphics.Paint.Align;
    import android.graphics.Path;
    import android.graphics.Shader;
    import android.graphics.Typeface;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.text.format.Time;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.KeyEvent;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.SeekBar;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class SeekView extends View {
    
        private static final String TAG = "SeekView";
    
        private final Paint mPaint = new Paint();
        private final double FM_STATION_FIELD = 108.0 - 87.5;
        private final double FM_STATION_MIN = 87.5;
        private final double FM_STATION_MAX = 108.0;
        private Bitmap mBitmapSlider;
        private Bitmap mBitmapSliderPress;
        private String mStrStationValue;
        private float mFloatStationValue;
        private float mOffSet;
        private float mSliderLength;
        private float mSliderMargin;
        private boolean mBoolClickPress;
        private Handler mHandler;
        Message mMessage;
        Bundle mBundle;
    
        public SeekView(Context context) {
            super(context);
        }
    
        public SeekView(Context context, final Handler mHandler) {
            super(context);
            this.mHandler = mHandler;
            mBundle = new Bundle();
            mSliderLength = 0;
            mSliderMargin = (float) context.getResources().getDimension(R.dimen.slider_margin);
            mBitmapSlider = BitmapFactory.decodeResource(context.getResources(), R.drawable.indicator);
            mBitmapSliderPress = BitmapFactory.decodeResource(context.getResources(), R.drawable.indicator_pressed);
            if (null != mBitmapSlider) {
                mSliderMargin = mSliderMargin + mBitmapSlider.getWidth() / 2;
            }
            mBoolClickPress = false;
            mStrStationValue = "87.5";
            mFloatStationValue = 87.5f;
        }
    
        public static float dip2px(Context context, float dpValue) {
            final float scale = context.getResources().getDisplayMetrics().density;
            return (dpValue * scale + 0.5f);
        }
    
        public static float px2dip(Context context, float pxValue) {
            final float scale = context.getResources().getDisplayMetrics().density;
            return (pxValue / scale + 0.5f);
        }
    
        public SeekView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public SeekView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        public String getStationValue() {
            return this.mStrStationValue;
        }
    
        public float getFloatStationValue() {
            return this.mFloatStationValue;
        }
    
        public void setStationValue(String st_v) {
            this.mStrStationValue = st_v;
            this.mFloatStationValue = Float.parseFloat(mStrStationValue);
            updateSeekView();
        }
    
        public void setStationValue(float st_v) {
            this.mFloatStationValue = st_v;
            this.mStrStationValue = Float.toString(this.mFloatStationValue);
            updateSeekView();
        }
    
        public void updateSeekView() {
            this.invalidate();
        }
    
        @Override
        public void onDraw(Canvas canvas) {
            float viewWidth = (float) getWidth();
            if (viewWidth == 0) {
                return;
            }
            if (mFloatStationValue < FM_STATION_MIN || mFloatStationValue > FM_STATION_MAX) {
                return;
            }
            mSliderLength = getWidth() - mSliderMargin * 2;
            mOffSet = (float) ((mFloatStationValue - 87.5) * mSliderLength / (108.0 - 87.5));
    
            canvas.drawBitmap(mBoolClickPress ? mBitmapSliderPress : mBitmapSlider,
                    mSliderMargin - mBitmapSlider.getWidth() / 2 + mOffSet, getTop(), mPaint);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            float mX = event.getX();
            float mY = event.getY();
            if (mY < getTop() || mY > getBottom()) {
                return false;
            }
            mSliderLength = getWidth() - mSliderMargin * 2;
            mOffSet = (float) ((mFloatStationValue - 87.5) * mSliderLength / (108.0 - 87.5));
            if (mY > getTop() && mY < (getTop() + mBitmapSlider.getHeight())
                    && mX > (mSliderMargin + mOffSet - mBitmapSlider.getWidth() / 2)
                    && mX < (mSliderMargin + mOffSet + mBitmapSlider.getWidth() / 2)) {
                mBoolClickPress = true;
            }
            if (event.getAction() == MotionEvent.ACTION_UP) {
                mBoolClickPress = false;
            }
            if (mX < mSliderMargin) {
                mOffSet = 0;
            } else if (mX > (getRight() - mSliderMargin)){
                mOffSet = mSliderLength;
            } else {
                mOffSet = mX - mSliderMargin;
            }
            mFloatStationValue = (float) (mOffSet * (108.0 - 87.5) / mSliderLength + 87.5);
    
            mBundle.putInt(FmRadioListener.KEY_STATION_VALUE, (int) ((mFloatStationValue) * 10));
            mMessage = new Message();
            mMessage.what = FmRadioListener.MSGID_MOVE_FINISHED;
            mMessage.setData(mBundle);
            mHandler.sendMessage(mMessage);
    
            this.invalidate();
            return true;
        }
    }
  • 相关阅读:
    ASP.NET Core管道详解[4]: 中间件委托链
    从执行上下文角度重新理解.NET(Core)的多线程编程[3]:安全上下文
    从执行上下文角度重新理解.NET(Core)的多线程编程[2]:同步上下文
    从执行上下文角度重新理解.NET(Core)的多线程编程[1]:基于调用链的”参数”传递
    ASP.NET Core管道详解[3]: Pipeline = IServer + IHttpApplication
    ASP.NET Core管道详解[2]: HttpContext本质论
    ASP.NET Core应用基本编程模式[5]:如何放置你的初始化代码
    如何实现Http请求报头的自动转发[设计篇]
    如何实现Http请求报头的自动转发[应用篇]
    采用”传统”方式获取当前HttpContext
  • 原文地址:https://www.cnblogs.com/wjhblogs/p/4698654.html
Copyright © 2011-2022 走看看