跑马灯实现(可以控制大小颜色速度并全屏显示)
一、基础代码
第一个页面(功能设置)
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);
四、实现效果: