首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何以编程方式创建或更改由不同颜色的线条组成的可绘制图形

如何以编程方式创建或更改由不同颜色的线条组成的可绘制图形
EN

Stack Overflow用户
提问于 2013-07-30 14:47:56
回答 4查看 18K关注 0票数 7

我必须画一个3dp线来代表一个水平完成在一个测试游戏。

这条线必须有两种颜色。例如,如果用户已经完成了40%的水平,线将是红色的前40%的线,其余60%是灰色的。

我成功地做到了这一点:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="line" >
            <size android:height="3dp" android:width="40dp"/>
            <stroke
                android:width="1dp"
                android:color="#FFFC10" />
        </shape>
    </item>
    <item android:left="40dp">
        <shape android:shape="line" >
            <size android:height="3dp" android:width="60dp" />
            <stroke
                android:width="1dp"
                android:color="#DDDDDD" />
        </shape>
    </item>
</layer-list>

然后我用一个ImageView显示它:

代码语言:javascript
运行
复制
<ImageView
                android:id="@+id/row_completion_bar"
                android:src="@drawable/completion_bar"
                android:layout_width="100dp"
                android:layout_height="3dp" />

..。但现在,我当然必须能够改变这40%/60%的比例取决于实际用户的完成。

第一个问题:最有效的方法是什么?在运行时更改绘图吗?还是用Java在运行时创建一个新的可绘图?

第二个问题:怎么做?我尝试了两种方法(在java代码中重新创建这个可绘制的xml /在运行时更改xml可绘制),但没有成功:-(

任何帮助都将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-30 16:53:46

因此,这是一个自定义绘图,您可以使用:

代码语言:javascript
运行
复制
class LineDrawable extends Drawable {
    private Paint mPaint;

    public LineDrawable() {
        mPaint = new Paint();
        mPaint.setStrokeWidth(3);
    }

    @Override
    public void draw(Canvas canvas) {
        int lvl = getLevel();
        Rect b = getBounds();
        float x = b.width() * lvl / 10000.0f;
        float y = (b.height() - mPaint.getStrokeWidth()) / 2;
        mPaint.setColor(0xffff0000);
        canvas.drawLine(0, y, x, y, mPaint);
        mPaint.setColor(0xff00ff00);
        canvas.drawLine(x, y, b.width(), y, mPaint);
    }

    @Override
    protected boolean onLevelChange(int level) {
        invalidateSelf();
        return true;
    }

    @Override
    public void setAlpha(int alpha) {
    }

    @Override
    public void setColorFilter(ColorFilter cf) {
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
}

测试代码:

代码语言:javascript
运行
复制
View v = new View(this);
final LineDrawable d = new LineDrawable();
d.setLevel(4000);
v.setBackgroundDrawable(d);
setContentView(v);
OnTouchListener l = new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int lvl = (int) (10000 * event.getX() / v.getWidth());
        d.setLevel(lvl);
        return true;
    }
};
v.setOnTouchListener(l);
票数 16
EN

Stack Overflow用户

发布于 2014-04-08 02:53:38

使用进度条怎么样?可以通过编程或通过xml文件设置完成标记和待办标记的样式。您的代码还将具有更高的可读性和可维护性,因为您将使用正确的小部件来执行任务。您的布局将包括:

代码语言:javascript
运行
复制
<ProgressBar
    android:id="@+id/progressBar"
    android:layout_height="3dip"
    android:layout_width="match_parent"
    android:progressDrawable="@drawable/progress_bar" />

您可以从代码中更新条形图,例如:

代码语言:javascript
运行
复制
ProgressBar bar = (ProgressBar)findViewById(R.id.progressBar);
bar.setProgress(40);

这个示例重写了条形图的样式(按照progressDrawable属性的指示),使用了下面的res/drawable/progress_bar.xml文件内容。这个有额外的好,像渐变阴影和圆角;调整你认为合适的:

代码语言:javascript
运行
复制
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
  <item android:id="@android:id/background">
    <shape>
      <corners android:radius="5dip" />
      <gradient
        android:angle="270"
        android:centerColor="#ff5a5d5a"
        android:centerY="0.5"
        android:endColor="#ff747674"
        android:startColor="#ff9d9e9d" />
    </shape>
  </item>
  <item android:id="@android:id/progress">
    <clip>
      <shape>
        <corners android:radius="5dip" />
          <gradient
            android:angle="0"
            android:endColor="#ff009900"
            android:startColor="#ff000099" />
      </shape>
    </clip>
  </item>
</layer-list>

归功于http://www.tiemenschut.com/how-to-customize-android-progress-bars/,它提供了更多关于如何定制进度条的详细信息。

票数 3
EN

Stack Overflow用户

发布于 2013-07-31 07:11:52

我找到了一个办法。不知道这是否是最有效的方法,但这里是:

我用RelativeLayout来叠加背景色的ImageViews。

在layout.xml中:

代码语言:javascript
运行
复制
<RelativeLayout style="@style/CompletionBar">

<ImageView
    android:id="@+id/row_completion_bar_0"
    style="@style/CompletionBar0" />

<ImageView
    android:id="@+id/row_completion_bar_1"
    style="@style/CompletionBar1" />       

</RelativeLayout>

在styles.xml中:

代码语言:javascript
运行
复制
<!-- Completion Bar (Relative Layout) -->
<style name="CompletionBar">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
</style>

<!-- Completion Bar 0 (ImageView) -->
<style name="CompletionBar0">
    <item name="android:layout_width">100dp</item>
    <item name="android:layout_height">2dp</item>
    <item name="android:background">#CCCCCC</item>
</style>

<!-- Completion Bar 1 (ImageView) -->
<style name="CompletionBar1">
    <item name="android:layout_width">40dp</item>
    <item name="android:layout_height">2dp</item>
    <item name="android:background">#555555</item>
</style>

在java文件中:

代码语言:javascript
运行
复制
ImageView cb1 = (ImageView)row.findViewById(R.id.row_completion_bar_1);
cb1.getLayoutParams().width = 40; /* Value in pixels, must convert to dp */
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17950258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档