Android 贴纸样式标签

private int strokeColor;

private int textSize;

private int textStyle;

private int textColor;

private boolean visual;

private int orientation;

// private float startPosX;

// private float startPosY;

// private float endPosX;

// private float endPosY;

private Paint rectPaint;

private Paint rectStrokePaint;

// simulator

private Path rectPath;

private Path textPath;

private Paint textPaint;

private Rect textBound;



private Context context;

private int alpha;



public LabelViewHelper(Context context, AttributeSet attrs, int defStyleAttr) {



    this.context = context;



    TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.LabelView, defStyleAttr, 0);

    distance = attributes.getDimensionPixelSize(R.styleable.LabelView\_label\_distance, dip2Px(DEFAULT\_DISTANCE));

    height = attributes.getDimensionPixelSize(R.styleable.LabelView\_label\_height, dip2Px(DEFAULT\_HEIGHT));

    strokeWidth = attributes.getDimensionPixelSize(R.styleable.LabelView\_label\_strokeWidth, dip2Px(DEFAULT\_STROKE\_WIDTH));

    text = attributes.getString(R.styleable.LabelView\_label\_text);

    backgroundColor = attributes.getColor(R.styleable.LabelView\_label\_backgroundColor, DEFAULT\_BACKGROUND\_COLOR);

    strokeColor = attributes.getColor(R.styleable.LabelView\_label\_strokeColor, DEFAULT\_STROKE\_COLOR);

    textSize = attributes.getDimensionPixelSize(R.styleable.LabelView\_label\_textSize, dip2Px(DEFAULT\_TEXT\_SIZE));

    textStyle = attributes.getInt(R.styleable.LabelView\_label\_textStyle, DEFAULT\_TEXT\_STYLE);

    textColor = attributes.getColor(R.styleable.LabelView\_label\_textColor, DEFAULT\_TEXT\_COLOR);

    visual = attributes.getBoolean(R.styleable.LabelView\_label\_visual, true);

    orientation = attributes.getInteger(R.styleable.LabelView\_label\_orientation, DEFAULT\_ORIENTATION);

    attributes.recycle();



    rectPaint = new Paint();

    rectPaint.setDither(true);

    rectPaint.setAntiAlias(true);

    rectPaint.setStyle(Paint.Style.FILL);



    rectStrokePaint = new Paint();

    rectStrokePaint.setDither(true);

    rectStrokePaint.setAntiAlias(true);

    rectStrokePaint.setStyle(Paint.Style.STROKE);



    rectPath = new Path();

    rectPath.reset();



    textPath = new Path();

    textPath.reset();



    textPaint = new Paint();

    textPaint.setDither(true);

    textPaint.setAntiAlias(true);

    textPaint.setStrokeJoin(Paint.Join.ROUND);

    textPaint.setStrokeCap(Paint.Cap.SQUARE);



    textBound = new Rect();

}



public void onDraw(Canvas canvas, int measuredWidth, int measuredHeight) {

    if (!visual || text == null) {

        return;

    }



    float actualDistance = distance + height / 2;

    calcOffset(measuredWidth, measuredHeight);



    rectPaint.setColor(backgroundColor);

    if (alpha != 0) {

        rectPaint.setAlpha(alpha);

    }



    rectStrokePaint.setColor(strokeColor);

    rectStrokePaint.setStrokeWidth(strokeWidth);



    canvas.drawPath(rectPath, rectPaint);

    canvas.drawPath(rectPath, rectStrokePaint);



    textPaint.setTextSize(textSize);

    textPaint.setColor(context.getResources().getColor(R.color.white));

    textPaint.getTextBounds(text, 0, text.length(), textBound);

    textPaint.setTypeface(Typeface.defaultFromStyle(textStyle));



    float begin\_w\_offset = (1.4142135f \* actualDistance) / 2 - textBound.width() / 2;

    if (begin\_w\_offset < 0) begin\_w\_offset = 0;



    canvas.drawTextOnPath(text, textPath, begin\_w\_offset, textBound.height() / 2, textPaint);

}



private void calcOffset(int measuredWidth, int measuredHeight) {

    float startPosX = measuredWidth - distance - height;

    float endPosX = measuredWidth;

    float startPosY = measuredHeight - distance - height;

    float endPosY = measuredHeight;



    float middle = height/2;



    switch (orientation) {

        case 1: // LEFT\_TOP



            rectPath.reset();

            rectPath.moveTo(0, distance);

            rectPath.lineTo(distance, 0);

            rectPath.lineTo(distance + height, 0);

            rectPath.lineTo(0, distance + height);

            rectPath.close();



            textPath.reset();

            textPath.moveTo(0, distance + middle);

            textPath.lineTo(distance + middle, 0);

            textPath.close();



            break;

        case 2: // RIGHT\_TOP



            rectPath.reset();

            rectPath.moveTo(startPosX, 0);

            rectPath.lineTo(startPosX + height, 0);

            rectPath.lineTo(endPosX, distance);

            rectPath.lineTo(endPosX, distance + height);

            rectPath.close();



            textPath.reset();

            textPath.moveTo(startPosX + middle, 0);

            textPath.lineTo(endPosX, distance + middle);

            textPath.close();



            break;

        case 3: // LEFT\_BOTTOM



            rectPath.reset();

            rectPath.moveTo(0, startPosY);

            rectPath.lineTo(distance + height, endPosY);

            rectPath.lineTo(distance, endPosY);

            rectPath.lineTo(0, startPosY + height);

            rectPath.close();



            textPath.reset();

            textPath.moveTo(0, startPosY + middle);

            textPath.lineTo(distance + middle, endPosY);

            textPath.close();



            break;

        case 4: // RIGHT\_BOTTOM



            rectPath.reset();

            rectPath.moveTo(startPosX, endPosY);

            rectPath.lineTo(measuredWidth, startPosY);

            rectPath.lineTo(measuredWidth, startPosY + height);

            rectPath.lineTo(startPosX + height, endPosY);

            rectPath.close();



            textPath.reset();

            textPath.moveTo(startPosX + middle, endPosY);

            textPath.lineTo(endPosX, startPosY + middle);

            textPath.close();



            break;

    }

}



private int dip2Px(float dip) {

    return (int) (dip \* context.getResources().getDisplayMetrics().density + 0.5f);

}



private int px2Dip(float px) {

    return (int) (px / context.getResources().getDisplayMetrics().density + 0.5f);

}



public void setLabelHeight(View view, int height) {

    if (this.height != dip2Px(height)) {

        this.height = dip2Px(height);

        view.invalidate();

    }

}



public int getLabelHeight() {

    return px2Dip(this.height);

}



public void setLabelDistance(View view, int distance) {

    if (this.distance != dip2Px(distance)) {

        this.distance = dip2Px(distance);

        view.invalidate();

    }

}



public int getLabelStrokeWidth() {

    return px2Dip(this.strokeWidth);

}



public void setLabelStrokeWidth(View view, int strokeWidth) {

    if (this.strokeWidth != dip2Px(strokeWidth)) {

        this.strokeWidth = dip2Px(strokeWidth);

        view.invalidate();

    }

}



public int getLabelDistance() {

    return px2Dip(this.distance);

}



public boolean isLabelVisual() {

    return visual;

}



public void setLabelVisual(View view, boolean visual) {

    if (this.visual != visual) {

        this.visual = visual;

        view.invalidate();

    }

}



public int getLabelOrientation() {

    return orientation;

}



public void setLabelOrientation(View view, int orientation) {

    if (this.orientation != orientation && orientation <= 4 && orientation >= 1) {

        this.orientation = orientation;

        view.invalidate();

    }

}



public int getLabelTextColor() {

    return textColor;

}



public void setLabelTextColor(View view, int textColor) {

    if (this.textColor != textColor) {

        this.textColor = textColor;

        view.invalidate();

    }

}



public int getLabelBackgroundColor() {

    return backgroundColor;

}



public void setLabelBackgroundColor(View view, int backgroundColor) {

    if (this.backgroundColor != backgroundColor) {

        this.backgroundColor = backgroundColor;

        view.invalidate();

    }

}



public int getLabelStrokeColor() {

    return strokeColor;

}



public void setLabelStrokeColor(View view, int strokeColor) {

    if (this.strokeColor != strokeColor) {

        this.strokeColor = strokeColor;

        view.invalidate();

    }

}





public void setLabelBackgroundAlpha(View view, int alpha) {

    if (this.alpha != alpha) {

        this.alpha = alpha;

        view.invalidate();

    }

}



public String getLabelText() {

    return text;

}



public void setLabelText(View view, String text) {

    if (this.text == null || !this.text.equals(text)) {

        this.text = text;

        view.invalidate();

    }

}



public int getLabelTextSize() {

    return px2Dip(this.textSize);

}



public void setLabelTextSize(View view, int textSize) {

    if (this.textSize != textSize) {

        this.textSize = textSize;

        view.invalidate();

    }

}



public int getLabelTextStyle(){

    return textStyle;

}



public void setLabelTextStyle(View view, int textStyle){

    if(this.textStyle == textStyle) return;

    this.textStyle = textStyle;

    view.invalidate();
《餐馆点餐管理系统——基于Java和MySQL的课程设计解析》 在信息技术日益发达的今天,餐饮行业的数字化管理已经成为一种趋势。本次课程设计的主题是“餐馆点餐管理系统”,它结合了编程语言Java和数据库管理系统MySQL,旨在帮助初学者理解如何构建一个实际的、具有基本功能的餐饮管理软。下面,我们将深入探讨这个系统的实现细节及其所涉及的关键知识点。 我们要关注的是数据库设计。在“res_db.sql”文中,我们可以看到数据库的结构,可能包括菜品表、订单表、顾客信息表等。在MySQL中,我们需要创建这些表格并定义相应的字段,如菜品ID、名称、价格、库存等。此外,还要设置主键、外键来保证数据的一致性和完整性。例如,菜品ID作为主键,确保每个菜品的唯一性;订单表中的顾客ID和菜品ID则作为外键,与顾客信息表和菜品表关联,形成数据间的联系。 接下来,我们来看Java部分。在这个系统中,Java主要负责前端界面的展示和后端逻辑的处理。使用Java Swing或JavaFX库可以创建用户友好的图形用户界面(GUI),让顾客能够方便地浏览菜单、下单。同时,Java还负责与MySQL数据库进行交互,通过JDBC(Java Database Connectivity)API实现数据的增删查改操作。在程序中,我们需要编写SQL语句,比如INSERT用于添加新的菜品信息,SELECT用于查询所有菜品,UPDATE用于更新菜品的价格,DELETE用于删除不再提供的菜品。 在系统设计中,我们还需要考虑一些关键功能的实现。例如,“新增菜品和价格”的功能,需要用户输入菜品信息,然后通过Java程序将这些信息存储到数据库中。在显示所有菜品的功能上,程序需要从数据库获取所有菜品数据,然后在界面上动态生成列表或者表格展示。同时,为了提高用户体验,可能还需要实现搜索和排序功能,允许用户根据菜品名称或价格进行筛选。 另外,安全性也是系统设计的重要一环。在连接数据库时,要避免SQL注入攻击,可以通过预编译的PreparedStatement对象来执行SQL命令。对于用户输入的数据,需要进行验证和过滤,防止非法字符和异常值。 这个“餐馆点餐管理系统”项目涵盖了Java编程、数据库设计与管理、用户界面设计等多个方面,是一个很好的学习实践平台。通过这个项目,初学者不仅可以提升编程技能,还能对数据库管理和软工程有更深入的理解。在实际开发过程中,还会遇到调试、测试、优化等挑战,这些都是成长为专业开发者不可或缺的经验积累
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值