[英]Is there a way to make shaped buttons in Android that you create in run time?
我們正在創建一個應用程序,您可以在運行時創建帶有形狀的按鈕來映射圖像,例如: http ://www.outsharked.com/imagemapster/default.aspx?demos.html#vegetables我們嘗試使用Android Paths,但您可以不能使路徑消失或改變顏色。
你有想法嗎?
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Botones btn = new Botones(this);
setContentView(btn);
}
private class Botones extends View {
ArrayList<Path> paths = new ArrayList<Path>();
ArrayList<Paint> paints = new ArrayList<Paint>();
public Botones(Context context) {
super(context);
}
public Paint paintn;
public Paint paintb;
public Canvas canvasg;
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvasg = canvas;
paintn = new Paint();
paintn.setColor(getColor(R.color.colorAccent));
paintn.setStyle(Paint.Style.STROKE);
paintn.setStrokeWidth(8);
paintn.setStyle(Paint.Style.FILL);
paints.add(paintn);
paintb = new Paint();
paintb.setColor(getColor(R.color.linea));
paintb.setStyle(Paint.Style.STROKE);
paintb.setStrokeWidth(8);
paintb.setStyle(Paint.Style.FILL);
paints.add(paintb);
coordenadas(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x;
float y;
x = event.getX();
y = event.getY();
for (Path p : paths){
RectF pBounds=new RectF();
p.computeBounds(pBounds,true);
if (pBounds.contains(x,y)){
Log.i("path", "tocado");
//paints.get(0).setColor(getColor(R.color.linea));
canvasg.drawPath(p, paintb);
}
}
return super.onTouchEvent(event);
}
public void coordenadas(Canvas canvas) {
int i;
boolean tipo = true;
String cadena = "13, 421, 7, 587, 274, 590, 262, 467, 106, 506, 65, 444, 12, 416" +
"|81, 13, 95, 55, 378, 70, 368, 4" +
"|543, 88, 522, 218, 751, 228, 750, 133, 602, 111" +
"|34, 268, 33, 383, 278, 389, 433, 356, 429, 288, 281, 312" +
"|46, 55, 21, 131, 119, 172, 275, 158, 273, 106, 89, 79";
String cadenaArray[] = cadena.split("\\|");
for (String img : cadenaArray) {
ArrayList<Float> x = new ArrayList<Float>();
ArrayList<Float> y = new ArrayList<Float>();
String imgArray[] = img.split("\\,");
for (String coordena : imgArray){
float fin = Float.parseFloat(coordena);
if (tipo){
x.add(fin);
} else {
y.add(fin);
}
tipo = !tipo;
}
dibujar(x,y, canvas);
}
}
public void dibujar(ArrayList<Float> coordx, ArrayList<Float> coordy, Canvas canvas){
Path path =new Path();
paths.add(path);
canvas.drawColor(getColor(android.R.color.transparent));
path.moveTo(coordx.get(0), coordy.get(0));
for (int z = 1; z < coordx.size(); z++){
path.lineTo(coordx.get(z),coordy.get(z));
}
path.lineTo(coordx.get(0),coordy.get(0));
canvas.drawPath(path, paintn);
}
}
}
我還沒有練習過,但是找到了解決方案。 由於android studio支持javascript和CSS,因此您可以執行自己要求的操作。 在給定的鏈接中,您可以找到所需任務的javascript和css文件。 然后,您可以點擊此給定的鏈接,其中提供了有關在Android Studio中添加javascript和css的所有信息。 點擊此鏈接 。
您可以使用觸摸委托(在Android SDK中)來實現。 您可能很難創建形狀,但是可以嘗試一下:)
這是Vogella教程的摘錄( http://blog.vogella.com/2012/04/15/android-using-touchdelegates/ ):
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mButton = (Button) findViewById(R.id.delegated_button);
View parent = findViewById(R.id.root);
parent.post(new Runnable() {
public void run() {
// Post in the parent's message queue to make sure the parent
// lays out its children before we call getHitRect()
Rect delegateArea = new Rect();
Button delegate = mButton;
delegate.getHitRect(delegateArea);
delegateArea.top -= 600;
delegateArea.bottom += 600;
delegateArea.left -= 600;
delegateArea.right += 600;
TouchDelegate expandedArea = new TouchDelegate(delegateArea,
delegate);
// give the delegate to an ancestor of the view we're
// delegating the
// area to
if (View.class.isInstance(delegate.getParent())) {
((View) delegate.getParent())
.setTouchDelegate(expandedArea);
}
};
});
}
祝好運!
唯一的方法就是以這種方式調用invalidate(),然后調用onDraw()並使用所需的更改重新繪制整個視圖。
onDraw()完成后,畫布無效。
我希望這有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.