Java 按边框表示进度
我需要用视野的边界来表示进展。 例如,最初的视图根本没有边框,当进度达到50%时,只有50%的视图会有边框。找到附加的图像。 我在谷歌上搜索了很多次,但运气不好。我使用的视图是文本视图 已编辑 下面的代码,剪切位图的边。 我在这段代码中所做的是- 1.Bg设置为黑色六边形 2.我画了一个中空的绿色边框的六边形&显示这个中空的六边形,这样看起来就像是边框在堆积Java 按边框表示进度,java,android,progress-bar,android-custom-view,android-progressbar,Java,Android,Progress Bar,Android Custom View,Android Progressbar,我需要用视野的边界来表示进展。 例如,最初的视图根本没有边框,当进度达到50%时,只有50%的视图会有边框。找到附加的图像。 我在谷歌上搜索了很多次,但运气不好。我使用的视图是文本视图 已编辑 下面的代码,剪切位图的边。 我在这段代码中所做的是- 1.Bg设置为黑色六边形 2.我画了一个中空的绿色边框的六边形&显示这个中空的六边形,这样看起来就像是边框在堆积 public class MyView extends View { private Bitmap mBitmap; private
public class MyView extends View {
private Bitmap mBitmap;
private Paint mPaint;
private RectF mOval;
private float mAngle = 135;
private Paint mTextPaint;
private Bitmap bgBitmap;
public MyView(Context context) {
super(context);
doInit();
}
/**
* @param context
* @param attrs
* @param defStyleAttr
*/
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
doInit();
}
/**
* @param context
* @param attrs
*/
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
doInit();
}
private void doInit() {
// use your bitmap insted of R.drawable.ic_launcher
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.hexagon_border);
bgBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.view_message_small_hexagon);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mOval = new RectF();
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mTextPaint.setTextSize(48);
mTextPaint.setTextAlign(Align.CENTER);
mTextPaint.setColor(0xffffaa00);
mTextPaint.setTypeface(Typeface.DEFAULT_BOLD);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
Matrix m = new Matrix();
RectF src = new RectF(0, 0, mBitmap.getWidth(), mBitmap.getHeight());
RectF dst = new RectF(0, 0, w, h);
m.setRectToRect(src, dst, ScaleToFit.CENTER);
Shader shader = new BitmapShader(mBitmap, TileMode.CLAMP, TileMode.CLAMP);
shader.setLocalMatrix(m);
mPaint.setShader(shader);
m.mapRect(mOval, src);
}
@Override
protected void onDraw(Canvas canvas) {
//canvas.drawColor(0xff0000aa);
Matrix matrix = new Matrix();
canvas.drawBitmap(bgBitmap, matrix, null);
canvas.drawArc(mOval, -90, mAngle, true, mPaint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float w2 = getWidth() / 2f;
float h2 = getHeight() / 2f;
mAngle = (float) Math.toDegrees(Math.atan2(event.getY() - h2, event.getX() - w2));
mAngle += 90 + 360;
mAngle %= 360;
invalidate();
return true;
}
}试试:
获得一个好的循环进度微调器本身是困难的。是一个很好的自定义
视图
。您应该能够修改的onDraw()类,以执行与您想要的非常类似的操作。在这里查看我的答案我已经阅读了您的代码,但不知道应该做哪些更改才能使其按预期工作。请想一想,现在您有了一个解决方案,即如何以径向方式剪裁一个位,下一步是什么?@pskink我已经编辑了我的问题。我现在面临的唯一问题是六边形的边缘被切割。你知道为什么会发生这种情况吗?我没有尝试过这个代码…但我认为这会在视图周围绘制椭圆形。对吗?它应该以椭圆形的方式显示你的位图。我不想显示图像,我想在它周围画一个边框。@VishalPawale这段代码可以满足您的需要,您只需要在代码中添加一个小东西好的……然后……我会尝试它……会根据需要进行更改并让您知道
public class MyView extends View {
private Bitmap mBitmap;
private Paint mPaint;
private RectF mOval;
private float mAngle = 135;
private Paint mTextPaint;
public MyView(Context context) {
super(context);
// use your bitmap insted of R.drawable.ic_launcher
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mOval = new RectF();
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mTextPaint.setTextSize(48);
mTextPaint.setTextAlign(Align.CENTER);
mTextPaint.setColor(0xffffaa00);
mTextPaint.setTypeface(Typeface.DEFAULT_BOLD);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
Matrix m = new Matrix();
RectF src = new RectF(0, 0, mBitmap.getWidth(), mBitmap.getHeight());
RectF dst = new RectF(0, 0, w, h);
m.setRectToRect(src, dst, ScaleToFit.CENTER);
Shader shader = new BitmapShader(mBitmap, TileMode.CLAMP, TileMode.CLAMP);
shader.setLocalMatrix(m);
mPaint.setShader(shader);
m.mapRect(mOval, src);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(0xff0000aa);
canvas.drawArc(mOval, -90, mAngle, true, mPaint);
canvas.drawText("click me", getWidth() / 2, getHeight() / 2, mTextPaint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float w2 = getWidth() / 2f;
float h2 = getHeight() / 2f;
mAngle = (float) Math.toDegrees(Math.atan2(event.getY() - h2, event.getX() - w2));
mAngle += 90 + 360;
mAngle %= 360;
invalidate();
return true;
}
}