Android跑马灯实现(可以控制大小颜色速度并全屏显示)

该博客介绍了如何创建一个具备大小、颜色、速度控制功能的跑马灯,并能全屏显示。通过自定义MarqueeTextView2实现跑马灯效果,同时提供了ColorPickerView用于选择颜色。在第二个页面中,接收到跑马灯参数并全屏显示。文章还涉及了SeekBar的值设置、隐藏键盘、EditText内容监听以及Intent值传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

跑马灯实现(可以控制大小颜色速度并全屏显示)

一、基础代码
第一个页面(功能设置)
xml界面:

<LinearLayout
    android:id="@+id/t2"
    android:layout_width="match_parent"
    android:layout_height="80dp"
    android:layout_marginTop="20dp"
    android:gravity="center"
    android:orientation="horizontal">

    <EditText
        android:id="@+id/et_detail"
        android:layout_width="@dimen/dp_180"
        android:layout_height="@dimen/dp_60"
        android:layout_gravity="center"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:hint="请输入跑马灯内容"
        android:singleLine="true"
        android:textColor="@color/white"
        android:theme="@style/CreateEditText" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:layout_margin="@dimen/dp_10">

        <TextView
            android:id="@+id/text_size"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginTop="20dp"
            android:layout_weight="1"
            android:gravity="left"
            android:text="大小"
            android:textColor="@color/white"
            android:textSize="14sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/tv_info"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginTop="20dp"
            android:layout_weight="1"
            android:gravity="center"
            android:text="颜色取值"
            android:textColor="@color/white"
            android:textSize="14sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/text_speed"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginTop="20dp"
            android:layout_weight="1"
            android:gravity="right"
            android:text="速度"
            android:textColor="@color/white"
            android:textSize="14sp"
            android:textStyle="bold" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:layout_margin="@dimen/dp_10"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/txt1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="start"
            android:text=""
            android:textSize="14sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/txt"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="end"
            android:text=""
            android:textSize="14sp"
            android:textStyle="bold" />


    </LinearLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_240"
        android:orientation="horizontal">

        <LinearLayout
            android:layout_width="0dip"
            android:layout_height="match_parent"
            android:layout_weight="1">

            <com.jaygoo.widget.VerticalRangeSeekBar
                android:id="@+id/vsb_text_size"
                android:layout_width="wrap_content"
                android:layout_height="200dp"
                android:layout_margin="5dp"
                android:layout_marginTop="@dimen/dp_10"
                android:minLines="1"
                android:progress="120"
                app:rsb_max="240"
                app:rsb_mode="single"
                app:rsb_thumb_size="16dp" />

        </LinearLayout>

        <LinearLayout
            android:id="@+id/ll_color"
            android:layout_width="0dip"
            android:layout_height="150dip"
            android:layout_marginTop="14dp"
            android:layout_weight="8"
            android:gravity="center|top"
            android:orientation="vertical" />

        <LinearLayout
            android:layout_width="0dip"
            android:layout_height="match_parent"
            android:layout_weight="1">

            <com.jaygoo.widget.VerticalRangeSeekBar
                android:id="@+id/vsb_text_speed"
                android:layout_width="wrap_content"
                android:layout_height="200dp"
                android:layout_margin="5dp"
                android:layout_marginTop="@dimen/dp_10"
                android:minLines="1"
                android:progress="20"
                app:rsb_max="40"
                app:rsb_mode="single"
                app:rsb_thumb_size="16dp" />

        </LinearLayout>
    </LinearLayout>

</LinearLayout>

<com.godoperate.calendertool.ui.weather.MarqueeTextView2
    android:id="@+id/test"
    android:layout_width="match_parent"
    android:layout_height="240dp"
    android:layout_gravity="top"
    android:maxLines="1"
    android:textSize="21sp" />

java代码:

private TextView tv;
private TextView txt;
private TextView txt1;

private ColorPickerView colorPickerView;
@Nullable
private MarqueeTextView2 test;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //    private TextView tvMarqueeOne;
    txt = findViewById(R.id.txt);
    txt1 = findViewById(R.id.txt1);
    LinearLayout tit = findViewById(R.id.tit);
    tit.setOnClickListener(v -> {
        InputMethodManager imm = (InputMethodManager)
                getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
    });
    test = this.findViewById(R.id.test);
    test.setText("");
    test.setTextColor(Color.parseColor("#FFFFFF"));
    initView();
}

@Override
protected Drawable setBackground() {
    return new ColorDrawable(Color.parseColor("#E8805F"));
}

@NotNull
@Override
protected String getToolName() {
    return "跑马灯";
}

@Override
protected int setOptionsMenu() {
    return R.menu.racelamp;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int i = item.getItemId();
    if (i == R.id.qpxs) {
        Intent intent = new Intent(RaceLampActivity.this, QpxsActivity.class);
        assert test != null;
        intent.putExtra("yanse", test.getTextColor());
        intent.putExtra("daxiao", test.getTextSize());
        intent.putExtra("neirong", test.getText());
        intent.putExtra("sd", test.getTextSpeed());
        startActivity(intent);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@NotNull
@SuppressLint("InflateParams")
@Override
protected View setRealContentView(FrameLayout content) {
    return LayoutInflater.from(this).inflate(R.layout.activity_pmd2, null);
}

private void initView() {
    EditText et_detail = findViewById(R.id.et_detail);
    et_detail.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            assert test != null;
            test.setText(s.toString());

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

    VerticalRangeSeekBar vsb_text_size = findViewById(R.id.vsb_text_size);
    VerticalRangeSeekBar vsb_text_speed = findViewById(R.id.vsb_text_speed);
    assert test != null;
    vsb_text_size.setOnRangeChangedListener(new OnRangeChangedListener() {
        @Override
        public void onRangeChanged(RangeSeekBar view, float leftValue, float rightValue, boolean isFromUser) {
            if (test != null) {
                test.setTextSize(leftValue);
                txt1.setText(String.format(Locale.CHINA, "当前大小:%d  / 240 ", (int) leftValue));
            }
        }

        @Override
        public void onStartTrackingTouch(RangeSeekBar view, boolean isLeft) {

        }

        @Override
        public void onStopTrackingTouch(RangeSeekBar view, boolean isLeft) {

        }
    });
    vsb_text_speed.setOnRangeChangedListener(new OnRangeChangedListener() {
        @Override
        public void onRangeChanged(RangeSeekBar view, float leftValue, float rightValue, boolean isFromUser) {
            if (test != null) {
                txt.setText(String.format(Locale.CHINA, "当前速度:%d  / 40 ", (int) leftValue));
                test.setTextSpeed(leftValue);
            }
        }

        @Override
        public void onStartTrackingTouch(RangeSeekBar view, boolean isLeft) {

        }

        @Override
        public void onStopTrackingTouch(RangeSeekBar view, boolean isLeft) {

        }
    });

    LinearLayout ll = findViewById(R.id.ll_color);
    tv = findViewById(R.id.tv_info);
    colorPickerView = new ColorPickerView(this);
    ll.addView(colorPickerView);
    colorPickerView.setOnColorBackListener((a, r, g, b) -> {
        tv.setText(String.format(Locale.CHINA, "R:%d\nG:%d\nB:%d\n%s", r, g, b, colorPickerView.getStrColor()));
        tv.setTextColor(Color.argb(a, r, g, b));
        assert test != null;
        test.setTextColor(Color.argb(a, r, g, b));

   });
}
}

第2个页面(全屏显示)
xml界面:

<com.godoperate.calendertool.ui.weather.MarqueeTextView2
    android:id="@+id/qpxsnr"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

java代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_qpxs);
    MarqueeTextView2 qpxsnr = findViewById(R.id.qpxsnr);
    getWindow().setFlags(0x400, 0x400);
    int yanse = getIntent().getIntExtra("yanse", -1);
    float daxiao = getIntent().getFloatExtra("daxiao", -1);
    float sd = getIntent().getFloatExtra("sd", 0);
    String neirong = getIntent().getStringExtra("neirong");
    Log.e("TAG", "onCreate: " + yanse);
    Log.e("TAG", "onCreate: " + daxiao);
    Log.e("TAG", "onCreate: " + neirong);
    qpxsnr.setText(neirong);
    qpxsnr.setTextSize(daxiao);
    qpxsnr.setTextColor(yanse);
    if (sd == 0) {
        qpxsnr.setScroll(false);
    } else {
        qpxsnr.setTextSpeed(sd);
    }
}

@Override
protected void onResume() {
    /*
     * 设置为横屏
     */
    if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
    super.onResume();
}

}

二、用到的自定义控件
颜色取色器:

public class ColorPickerView extends View {
private static final float PI = (float) Math.PI;
private Paint paintCirclePhantom;
private Paint paintCircle;
private Paint paintCenterShadow;
private Paint paintCenter;
private Paint paintGrayShadow;
private Paint paintGray;
private Paint paintLightShadow;
private Paint paintLight;
private double Zoom;
private int[] arrColorGray;
private final int[] arrColorCircle = new int[]{0xFFFF0000, 0xFFFF00FF,
        0xFF0000FF, 0xFF00FFFF, 0xFF00FF00, 0xFFFFFF00, 0xFFFF0000};
private boolean mRedrawHSV;
private boolean IsPressCenter;
private boolean IsMoveCenter;

private int CenterX = 100;
private int CenterY = 100;
private int CenterRadius = 30;
private String strColor = "";

private OnColorBackListener l;

public ColorPickerView(Context context) {
    super(context);
    float density = getContext().getResources().getDisplayMetrics().density;
    double Zoom = (double) (density / 2.0 + 0.5);
    int color = Color.parseColor("#FFFFFF");
    init(color, Zoom);
}

public ColorPickerView(Context context, int color, double Zoom) {
    super(context);
    init(color, Zoom);
}

private void init(int color, double Zoom) {
    this.Zoom = Zoom;
    CenterX = (int) (100 * Zoom);
    CenterY = (int) (100 * Zoom);
    CenterRadius = (int) (30 * Zoom);
    paintCirclePhantom = new Paint(Paint.ANTI_ALIAS_FLAG);
    paintCircle = new Paint(Paint.ANTI_ALIAS_FLAG);
    paintCenterShadow = new Paint(Paint.ANTI_ALIAS_FLAG);
    paintCenter = new Paint(Paint.ANTI_ALIAS_FLAG);
    paintGrayShadow = new Paint(Paint.ANTI_ALIAS_FLAG);
    paintGray = new Paint(Paint.ANTI_ALIAS_FLAG);
    paintLightShadow = new Paint(Paint.ANTI_ALIAS_FLAG);
    paintLight = new Paint(Paint.ANTI_ALIAS_FLAG);
    paintCirclePhantom.setColor(0xFF000000);
    paintCirclePhantom.setStyle(Paint.Style.STROKE);
    paintCirclePhantom.setStrokeWidth((float) (32 * Zoom));

    paintCircle.setShader(new SweepGradient(0, 0, arrColorCircle, null));
    paintCircle.setStyle(Paint.Style.STROKE);
    paintCircle.setStrokeWidth((float) (32 * Zoom));

    paintCenterShadow.setColor(0xFF000000);
    paintCenterShadow.setStrokeWidth((float) (5 * Zoom));

    paintCenter.setColor(color);
    paintCenter.setStrokeWidth((float) (5 * Zoom));

    paintGrayShadow.setColor(0xFF000000);
    paintGrayShadow.setStrokeWidth((float) (30 * Zoom));

    arrColorGray = new int[]{0xFFFFFFFF, color, 0xFF000000};
    paintGray.setStrokeWidth((float) (30 * Zoom));

    paintLightShadow.setColor(0xFF000000);
    paintLightShadow.setStrokeWidth((float) (60 * Zoom));

    paintLight.setStrokeWidth((float) (60 * Zoom));

    mRedrawHSV = true;
}

@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
    canvas.translate(CenterX, CenterY);
    float r = CenterX - paintCircle.getStrokeWidth() * 0.5f; 
    int color = paintCenter.getColor();
    strColor = "#" + Integer.toHexString(color).substring(2).toUpperCase();

    if (mRedrawHSV) {
        arrColorGray[1] = color;
        paintGray.setShader(new LinearGradient(CenterX, -CenterY, CenterX,
                (float) (100 * Zoom), arrColorGray, null,
                Shader.TileMode.CLAMP));
    }

    canvas.drawOval(new RectF(-r + 3, -r + 3, r + 3, r + 3),
            paintCirclePhantom);
    canvas.drawOval(new RectF(-r, -r, r, r), paintCircle);
    canvas.drawCircle(3, 3, CenterRadius, paintCenterShadow);
    canvas.drawCircle(0, 0, CenterRadius, paintCenter);
    canvas.drawRect(new RectF(CenterX + (float) (18 * Zoom), -CenterY + 3,
                    CenterX + (float) (48 * Zoom), (float) (103 * Zoom)),
            paintGrayShadow);
    canvas.drawRect(new RectF(CenterX + (float) (15 * Zoom), -CenterY,
            CenterX + (float) (45 * Zoom), (float) (100 * Zoom)), paintGray); 

    if (IsPressCenter) {
        paintCenter.setStyle(Paint.Style.STROKE);

        if (IsMoveCenter)
            paintCenter.setAlpha(0xFF);
        else
            paintCenter.setAlpha(0x66);

        canvas.drawCircle(0, 0,
                CenterRadius + paintCenter.getStrokeWidth(), paintCenter);
        paintCenter.setStyle(Paint.Style.FILL);
        paintCenter.setColor(color);
    }

    mRedrawHSV = true;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(CenterX * 2 + 50, CenterY * 2 + 23);
}

private int ave(int s, int d, float p) {
    return s + Math.round(p * (d - s));
}

private int interpColor(int[] colors, float unit) {
    if (unit <= 0) {
        return colors[0];
    }
    if (unit >= 1) {
        return colors[colors.length - 1];
    }

    float p = unit * (colors.length - 1);
    int i = (int) p;
    p -= i;

    int c0 = colors[i];
    int c1 = colors[i + 1];
    int a = ave(Color.alpha(c0), Color.alpha(c1), p);
    int r = ave(Color.red(c0), Color.red(c1), p);
    int g = ave(Color.green(c0), Color.green(c1), p);
    int b = ave(Color.blue(c0), Color.blue(c1), p);
    if (l != null) {
        l.onColorBack(a, r, g, b);
    }
    return Color.argb(a, r, g, b);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX() - CenterX;
    float y = event.getY() - CenterY;
    boolean inCenter = Math.sqrt(x * x + y * y) <= CenterRadius;

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            IsPressCenter = inCenter;
            if (inCenter) {
                IsMoveCenter = true;
                invalidate();
                break;
            }
        }
        case MotionEvent.ACTION_MOVE: {
            if (IsPressCenter) {
                if (IsMoveCenter != inCenter) {
                    IsMoveCenter = inCenter;
                    invalidate();
                }
            } else if ((x >= -CenterX && x <= CenterX)
                    && (y >= -CenterY && y <= CenterY)) {
                float angle = (float) Math.atan2(y, x);
                float unit = angle / (2 * PI);
                if (unit < 0)
                    unit += 1;
                paintCenter.setColor(interpColor(arrColorCircle, unit));
                invalidate();
            } else {
                int a, r, g, b, c0, c1;
                float p;

                if (y < 0) {
                    c0 = arrColorGray[0];
                    c1 = arrColorGray[1];
                    p = (y + 100) / 100;
                } else {
                    c0 = arrColorGray[1];
                    c1 = arrColorGray[2];
                    p = y / 100;
                }

                a = ave(Color.alpha(c0), Color.alpha(c1), p);
                r = ave(Color.red(c0), Color.red(c1), p);
                g = ave(Color.green(c0), Color.green(c1), p);
                b = ave(Color.blue(c0), Color.blue(c1), p);

                paintCenter.setColor(Color.argb(a, r, g, b));
                mRedrawHSV = false;
                if (l != null) {
                    l.onColorBack(a, r, g, b);
                }
                invalidate();
            }
            break;
        }
        case MotionEvent.ACTION_UP: {
            if (IsPressCenter) {
                IsPressCenter = false;
                invalidate();
            }
            break;
        }
    }
    return true;
}

public Paint getpaintCirclePhantom() {
    return paintCirclePhantom;
}

public void setpaintCirclePhantom(Paint paintCirclePhantom) {
    this.paintCirclePhantom = paintCirclePhantom;
}

public Paint getPaintCircle() {
    return paintCircle;
}

public void setPaintCircle(Paint paintCircle) {
    this.paintCircle = paintCircle;
}

public Paint getPaintCenterShadow() {
    return paintCenterShadow;
}

public void setPaintCenterShadow(Paint paintCenterShadow) {
    this.paintCenterShadow = paintCenterShadow;
}

public Paint getPaintCenter() {
    return paintCenter;
}

public void setPaintCenter(Paint paintCenter) {
    this.paintCenter = paintCenter;
}

public Paint getPaintGrayShadow() {
    return paintGrayShadow;
}

public void setPaintGrayShadow(Paint paintGrayShadow) {
    this.paintGrayShadow = paintGrayShadow;
}

public Paint getPaintGray() {
    return paintGray;
}

public void setPaintGray(Paint paintGray) {
    this.paintGray = paintGray;
}

public int[] getArrColorGray() {
    return arrColorGray;
}

public void setArrColorGray(int[] arrColorGray) {
    this.arrColorGray = arrColorGray;
}

public boolean ismRedrawHSV() {
    return mRedrawHSV;
}

public void setmRedrawHSV(boolean mRedrawHSV) {
    this.mRedrawHSV = mRedrawHSV;
}

public boolean isIsPressCenter() {
    return IsPressCenter;
}

public void setIsPressCenter(boolean isPressCenter) {
    IsPressCenter = isPressCenter;
}

public boolean isIsMoveCenter() {
    return IsMoveCenter;
}

public void setIsMoveCenter(boolean isMoveCenter) {
    IsMoveCenter = isMoveCenter;
}

public int[] getArrColorCircle() {
    return arrColorCircle;
}

public String getStrColor() {
    return strColor;
}

public void setStrColor(String strColor) {
    this.strColor = strColor;
}

public double getZoom() {
    return Zoom;
}

public void setZoom(double zoom) {
    Zoom = zoom;
}

public void setOnColorBackListener(OnColorBackListener l) {
    this.l = l;
}

public interface OnColorBackListener {
    public void onColorBack(int a, int r, int g, int b);
}

}

跑马灯:

public class MarqueeTextView2 extends View {
private final float DEF_TEXT_SIZE = 25.0F;//The default text size
private float mSpeed = 3.0F; //The default text scroll speed
private boolean isScroll = true; //The default set as auto scroll
private Paint mPaint;
private String mText;//This is to display the content
private float mTextSize;//This is text size
private int mTextColor = Color.argb(255, 255, 255, 255); //This is text color
 private float mCoordinateX;//Draw the starting point of the X coordinate
private float mCoordinateY;//Draw the starting point of the Y coordinate
private float mTextWidth; //This is text width
private int mViewWidth; //This is View width


public MarqueeTextView2(Context context) {
    super(context);
    init(context);
}

public MarqueeTextView2(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);

}

public MarqueeTextView2(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context);
}

/**
 * Initializes the related parameters
 *
 * @param context
 */


private void init(Context context) {

    if (TextUtils.isEmpty(mText)) {
        mText = "";
    }
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setTextSize(DEF_TEXT_SIZE);

}

public void setText(String text) {
    mText = text;
    if (TextUtils.isEmpty(mText)) {
        mText = "";
    }
    requestLayout();
    invalidate();
}

public String getText() {
    return mText;
}

/**
 * Set the text size, if this value is < 0, set to the default size
 *
 * @param textSize
 */
public void setTextSize(float textSize) {
    this.mTextSize = textSize;
    mPaint.setTextSize(mTextSize <= 0 ? DEF_TEXT_SIZE : mTextSize);
    requestLayout();
    invalidate();
}

public float getTextSize() {
    return mTextSize;
}

public void setTextColor(int textColor) {
    this.mTextColor = textColor;
    mPaint.setColor(mTextColor);
    invalidate();
}

public int getTextColor() {
    return mTextColor;
}

/**
 * Set the text scrolling speed, if the value < 0, set to the default is 0
 *
 * @param speed If this value is 0, then stop scrolling
 */
public void setTextSpeed(float speed) {
    this.mSpeed = speed < 0 ? 0 : speed;
    invalidate();
}

public float getTextSpeed() {
    return mSpeed;
}

public void setScroll(boolean isScroll) {
    this.isScroll = isScroll;
    invalidate();
}

public boolean isScroll() {
    return isScroll;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    mTextWidth = mPaint.measureText(mText);
    mViewWidth = measureWidth(widthMeasureSpec);
    mCoordinateX = (mViewWidth >> 1) - (mTextWidth / 2);
    int mViewHeight = measureHeight(heightMeasureSpec);
    mCoordinateY = getPaddingTop() + Math.abs(mPaint.ascent()) / 2 + (mViewHeight >> 1);

    //If you do not call this method, will be thrown "IllegalStateException"
    setMeasuredDimension(mViewWidth, mViewHeight);
}

private int measureHeight(int measureSpec) {
    int result;
    int specMode = MeasureSpec.getMode(measureSpec);
    int specSize = MeasureSpec.getSize(measureSpec);

    if (specMode == MeasureSpec.EXACTLY) {
        result = specSize;
    } else {
        result = (int) mPaint.getTextSize() + getPaddingTop()
                + getPaddingBottom();
        if (specMode == MeasureSpec.AT_MOST) {
            result = Math.min(result, specSize);
        }
    }
    return result;
}

private int measureWidth(int measureSpec) {
    int result;
    int specMode = MeasureSpec.getMode(measureSpec);
    int specSize = MeasureSpec.getSize(measureSpec);

    if (specMode == MeasureSpec.EXACTLY) {
        result = specSize;
    } else {
        result = (int) mPaint.measureText(mText) + getPaddingLeft()
                + getPaddingRight();
        if (specMode == MeasureSpec.AT_MOST) {
            result = Math.min(result, specSize);
        }
    }

    return result;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawText(mText, mCoordinateX, mCoordinateY, mPaint);
    if (!isScroll) {
        return;
    }
    mCoordinateX -= mSpeed;
    if (Math.abs(mCoordinateX) > mTextWidth && mCoordinateX < 0) {
        mCoordinateX = mViewWidth;
    }

   invalidate();
}
}

拖动条:

 public class VerticalRangeSeekBar extends RangeSeekBar {
 public final static int DICTION_LEFT = -1;
public final static int DICTION_RIGHT = 1;

private int orientation;

public VerticalRangeSeekBar(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray t = context.obtainStyledAttributes(attrs, R.styleable.RangeSeekBar);
    orientation = t.getInt(R.styleable.RangeSeekBar_rsb_orientation, DICTION_LEFT);
    t.recycle();
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(h, w, oldh, oldw);
}

@Override
protected void onDraw(Canvas canvas) {
    if (orientation == DICTION_LEFT){
        canvas.rotate(-90);
        canvas.translate(-getHeight(), 0);
    }else {
        canvas.rotate(90);
        canvas.translate(0,-getWidth());
    }
    super.onDraw(canvas);
}


@Override
protected float getEventX(MotionEvent event) {
    if (orientation == DICTION_LEFT){
        return getHeight() - event.getY();
    }else {
        return event.getY();
    }
}

@Override
protected float getEventY(MotionEvent event) {
    if (orientation == DICTION_LEFT){
        return event.getX();
    }else {
        return -event.getX() + getWidth();
    }
}

}

**

*三、一些遇到的问题方法梳理

**

1、给seekbar赋值**
调用setOnSeekBarChangeListener(),progress为seekbar值:

        vsb_text_size.setOnRangeChangedListener(new OnRangeChangedListener() {
        @Override
        public void onRangeChanged(RangeSeekBar view, float leftValue, float rightValue, boolean isFromUser) {
            if (test != null) {
                test.setTextSize(leftValue);
                txt1.setText(String.format(Locale.CHINA, "当前大小:%d  / 240 ", (int) leftValue));
            }
        }
        @Override
        public void onStartTrackingTouch(RangeSeekBar view, boolean isLeft) {

        }

        @Override
        public void onStopTrackingTouch(RangeSeekBar view, boolean isLeft) {

        }
    });

2、点击自动关闭键盘
tit为点击控件:

tit.setOnClickListener(v -> {
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
});

3、获取edittext输入内容
调用addTextChangedListener(),得到可以设置获取前,获取中,获取后值变化的方法:

        et_detail.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
         }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            test.setText(s.toString());//获取 et_detail输入中的内容

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

**

4:注意全局变量与局部变量的使用**

全局变量:
(1)定义位置:定义在类的内部,方法的外部。
(2)作用域:在其所在类内的所有方法均可调用。
(3)全局变量具有默认初始值。

局部变量:
相比全局变量,局部变量的特点更加复杂。

(1)定义位置:1.代码块2.方法参数列表,方法体内定义的变量
(2)作用域:从其定义位置开始到其所在的直接语句块结束
(3)局部变量没有默认值,使用时需要赋初值

销毁:
全局变量是整个程序都可访问的变量,谁都可以访问,生存期在整个程序从运行到结束(在程序结束时所占内存释放),
而局部变量存在于模块(子程序,函数)中,只有所在模块可以访问,其他模块不可直接访问,模块结束(函数调用完毕),局部变量消失,所占据的内存释放。

5.Intent值传递(这里一定要注意传递类型与接收类型)

传入:
Intent intent = new Intent(RaceLampActivity.this, QpxsActivity.class);
intent.putExtra(“neirong”, test.getText());
intent.putExtra(“sd”, test.getTextSpeed());

另一个activity接收:
String neirong = getIntent().getStringExtra(“neirong”);//String类型
float sd = getIntent().getFloatExtra(“sd”, 0);//float类型
获取接收的值后赋给需要的变量:
qpxsnr.setText(neirong);
qpxsnr.setTextSpeed(sd);

四、实现效果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值