0

我必须做一个项目,我有一个图像(如地板模式)并且我可以在这个图像上绘制矩形。

我设法绘制图像,缩放和拖动。我设法在此图像上绘制矩形并以图像的相同比例进行缩放。

所以我的主要问题是如何使用图像移动这些矩形。不使用矩阵。

我使用图像的中心作为几何地标,它可能是错误的。

谢谢您的帮助。

我的活动

public class ZoneActivity extends Activity implements OnItemSelectedListener, OnSeekBarChangeListener {
private TextView tv;
private View cadre;
ArrayList<RiskyZone> listRz;
private FloorImageView floorImage;
private final FloorMapper floormapper;
private Menu menu;
private SubMenu editRiskyZone;
private SubMenu editWard;

private SeekBar zoomBar; 

public ZoneActivity(FloorMapper floormapper){
    this.floormapper=floormapper;
}

public ZoneActivity(){
    this.floormapper=new FloorMapper();
    this.floormapper.addFloor(new Floor("floor0"));
    this.floormapper.addFloor(new Floor("floor1"));
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Spinner s = (Spinner) findViewById(R.id.zone_spinner);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, floormapper.getFloorNames());
    s.setAdapter(adapter);
    s.setOnItemSelectedListener(this);



    this.tv = (TextView) findViewById(R.id.testID);
    this.tv.setText("TEST2");
    this.tv.setTextColor(Color.rgb(200,0,0));

    listRz = new ArrayList<RiskyZone>();
    RiskyZone rz1 = new RiskyZone(Color.RED, 1, "toto");
    //rz1.addRectangle(new ZoneRectangle(new Coordinates(10, 40), new Coordinates(50, 50)));    
    rz1.addRectangle(new ZoneRectangle(new Coordinates(30, 50), new Coordinates(100, 100)));    

    RiskyZone rz2 = new RiskyZone(Color.BLUE, 2, "tata");
    rz2.addRectangle(new ZoneRectangle(new Coordinates(0, 0), new Coordinates(50, 60)));    


    listRz.add(rz1);
    listRz.add(rz2);



    this.floorImage = (FloorImageView) findViewById(R.id.zone_image);
    this.floorImage.setRiskyZones(listRz);

    //savoir la taille de l'image charge
    ViewTreeObserver vto = floorImage.getViewTreeObserver();
    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        public boolean onPreDraw() {
            int finalHeight = floorImage.getMeasuredHeight();
            int finalWidth = floorImage.getMeasuredWidth();
            //tv.setText("Height: " + finalHeight + " Width: " + finalWidth);
            return true;
        }
    });


    this.zoomBar = (SeekBar) findViewById(R.id.zoomBar);
    this.zoomBar.setOnSeekBarChangeListener(this);


}

/**
 * permet de changer de menu lorsque l'on change de floor
 * permet d'afficher que les zone a risque presente sur l'etage en cours de visu
 */
private void onChangeFloorChangeMenu(){
    if(editRiskyZone != null){
        editRiskyZone.clear();
        Floor floor = floormapper.getFloorByName(tv.getText().toString());

        // add menu items to the submenu
        for (RiskyZone rz : listRz) {
            //voir a ajoute une couleur sur chaque ligne
            editRiskyZone.add(R.string.edit_risky_zone, rz.getId(), Menu.NONE, rz.getName());
        }

        editWard.clear();
        //TODO:Ajouter les ward de l'etage dans le menu
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    //Creation des menus de base
    editRiskyZone = menu.addSubMenu(R.string.edit_risky_zone);
    editWard = menu.addSubMenu(R.string.edit_ward);
    return true;
}

@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
    String floorName = (String)parent.getItemAtPosition(pos);
    this.tv.setText((CharSequence) parent.getItemAtPosition(pos));
    int resId = getResources().getIdentifier(floorName, "drawable", getPackageName());
    this.floorImage.setImageResource(resId);
    onChangeFloorChangeMenu();
}

@Override
public void onNothingSelected(AdapterView<?> parent) {
    // Another interface callback
}

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    this.floorImage.setZoom(progress);
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
    // TODO Auto-generated method stub

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
    // TODO Auto-generated method stub

}
}

我的自定义 ImageView

public class FloorImageView extends ImageView implements OnTouchListener {
private Drawable image;
ImageButton img,img1;
private int zoomControler;
private int oldZoomControler;
private ArrayList<RiskyZone> riskyZones = new ArrayList<RiskyZone>();

PointF last = new PointF();
PointF start = new PointF();

private float translateX;
private float translateY;

private int left;
private int top;
private int right;
private int bottom;


public FloorImageView(Context context, AttributeSet attrset){
    super(context, attrset);
    image = context.getResources().getDrawable(R.drawable.floor0);
    setFocusable(true);
    setOnTouchListener(this);
}

public ArrayList<RiskyZone> getRiskyZones() {
    return riskyZones;
}

public void setRiskyZones(ArrayList<RiskyZone> riskyZones) {
    this.riskyZones = riskyZones;
}

public void drawZoneRectangles(Canvas canvas, ArrayList<Integer> riskyZoneFilters){
    for(RiskyZone r : riskyZones){
        canvas.save();
        ArrayList<ZoneRectangle> rectangles = (ArrayList<ZoneRectangle>) r.getRectangles();
        Paint paint = new Paint();
        paint.setAlpha(80);
        paint.setColor(r.getColor());
        for(ZoneRectangle rect : rectangles){

            float ratioX = (float)((right+oldZoomControler)-(left-oldZoomControler))/(float)((right+(getWidth()/2))-(left-(getWidth()/2)));
            float ratioY = (float)((bottom+oldZoomControler)-(top-oldZoomControler))/(float)((bottom+(getWidth()/2))-(top-(getWidth()/2)));


            float xDistance = (rect.getCooSE().getX()-rect.getCooNW().getX());
            float yDistance = (rect.getCooSE().getY()-rect.getCooNW().getY());
            System.out.println("xDistance = " + xDistance + " :::   yDistance = " +  yDistance);

            float xCenter = (rect.getCooNW().getX() + (xDistance/2)) + this.left - (rect.getCooNW().getX() + this.left);
            float yCenter = (rect.getCooNW().getY() + (yDistance/2)) + this.bottom - (rect.getCooNW().getY() + this.bottom);
            System.out.println("xCenter = " + xCenter + " yCenter = " +  yCenter);

            canvas.drawRect(xCenter-((xDistance/2)*ratioX), yCenter-((yDistance/2)*ratioY), 
                    xCenter+((xDistance/2)*ratioX), yCenter+((yDistance/2)*ratioY) , paint);
        }
        canvas.restore();
    }
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawColor(0xff000000);

    image.setBounds(left-zoomControler, top-zoomControler, right+zoomControler, bottom+zoomControler);
    image.draw(canvas);
    drawZoneRectangles(canvas, new ArrayList<Integer>());

}


public void setZoom(int zoom){
    System.out.println(zoom);
    this.oldZoomControler = this.zoomControler;
    this.zoomControler = (getWidth()/2) + (zoom*10);
    invalidate();
}

@Override
public void setImageResource(int resId) {
    super.setImageResource(resId);
    this.image = getResources().getDrawable(resId);
    this.zoomControler = getWidth()/2;
    this.left = (getWidth()/2);
    this.top = (getHeight()/2);
    this.right = (getWidth()/2);
    this.bottom = (getHeight()/2);
}


@Override
public boolean onTouch(View v, MotionEvent event) {
    PointF curr = new PointF(event.getX(), event.getY());

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        last.set(curr);
        start.set(last);

        break;

    case MotionEvent.ACTION_MOVE:
        float deltaX = curr.x - last.x;
        float deltaY = curr.y - last.y;

        translateX = deltaX;
        translateY = deltaY;

        this.left = this.left + (int) deltaX;
        this.top = this.top + (int) deltaY;
        this.right = this.right + (int) deltaX;
        this.bottom = this.bottom + (int) deltaY;

        last.set(curr.x, curr.y);
        break;
    case MotionEvent.ACTION_UP:
        break;

    case MotionEvent.ACTION_POINTER_UP:
        break;
    }

    invalidate();
    return true;
}
}

XML 活动

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
xmlns:app="fr.umlv.assistoid.zoning"
android:layout_height="fill_parent"
android:background="#000000"
android:layout_centerHorizontal="true"
android:orientation="vertical" >

<Spinner
    android:id="@+id/zone_spinner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:background="#FFFFFF"/>

<TextView
    android:id="@+id/testID"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="floor0"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<fr.umlv.assistoid.zoning.FloorImageView
    android:id="@+id/zone_image"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/floor0" 
    android:layout_weight="2">
</fr.umlv.assistoid.zoning.FloorImageView>

<SeekBar
    android:id="@+id/zoomBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
</LinearLayout>
4

0 回答 0