2013-02-05 15 views
11

Voglio collegare 2 immagini in Android. Esempio,Connessione di 2 immagini in Android

enter image description here

enter image description here

io voglio che siano in questo modo, enter image description here

ho già fatto codificando difficile. Per prima cosa trovo la parte in alto a sinistra dell'immagine verde e poi trovo il punto in basso a sinistra del lato verde. Lo faccio con i parametri event.gerRawX() ed event.getRawY() dell'evento touch. Ora conosco la distanza in xey tra questi due punti. Faccio la stessa cosa anche per quello rosso. Ora, quando il pezzo verde viene spostato vicino al rosso, calcolo se il punto in alto a sinistra del pezzo rosso è vicino alla parte inferiore sinistra del pezzo verde. se è così, traduco quello verde/rosso nell'altro. Ma questo calcolo hard coded dovrebbe fallire per tablet o telefono della stessa misura con risoluzione diversa. Voglio solo sapere come generalizzare la soluzione. Grazie.

Modifica: My GameAttività e classe ImageInfo in cui provo a collegare entrambe le immagini. In realtà ho 6 immagini come questa. E io li connetto. Come l'immagine 1 si collegherà all'immagine 2 e all'immagine 2 e 3 e così via.

GameActivity classe

package com.example.JigSawPuzzle; 


import com.example.test.R; 

import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.Context;  
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.pm.ActivityInfo; 
import android.content.res.Configuration; 
import android.graphics.Point; 
import android.media.AudioManager; 
import android.media.SoundPool; 
import android.os.Bundle; 
import android.util.DisplayMetrics; 
import android.util.Log; 
import android.view.Display; 
import android.view.MotionEvent; 
import android.view.Surface; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.View.OnTouchListener; 
import android.view.ViewGroup.LayoutParams; 

import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.RelativeLayout; 
import android.widget.Toast; 

@SuppressLint("NewApi") 
public class GameActivity extends Activity implements OnTouchListener 
{ 
static double screenInches; 
int touchStartX = 0; 
int touchStartY = 0; 

int diffX = 0; 
int diffY = 0; 
int attachedPieces=0; 
int imageX = 0; 
int imageY = 0; 
int height,width; 
boolean [] flag = new boolean[7]; 
boolean isPortait; 
RelativeLayout relataivelayoutLayout; 
RelativeLayout.LayoutParams paramsA,paramsB,paramsC,paramsD,paramsE,paramsF; 
ImageView imageA,imageB,imageC,imageD,imageE,imageF; 
ImageInfo [] imageInfoArray = new ImageInfo[7]; 

// added for sound effect 
private SoundPool soundPool; 
private int correctPieceAttachSoundId,gameFinishSoundId; 
private boolean loaded = false; 

//for 10inch landscape height = 752, width = 1280; portrait height = 1232 width = 800 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    isPortait = (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) ? false : true; 
    Display display = getWindowManager().getDefaultDisplay(); 
    height = display.getHeight(); 
    width = display.getWidth();  

    imageA = new ImageView(this); 
    imageB = new ImageView(this); 
    imageC = new ImageView(this); 
    imageD = new ImageView(this); 
    imageE = new ImageView(this); 
    imageF = new ImageView(this); 

    DisplayMetrics dm = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(dm); 
    double x = Math.pow(dm.widthPixels/dm.xdpi,2); 
    double y = Math.pow(dm.heightPixels/dm.ydpi,2); 
    screenInches = Math.sqrt(x+y); 


    if(screenInches>9.0) 
    { 

     imageA.setBackgroundResource(R.drawable.a); 
     imageB.setBackgroundResource(R.drawable.b); 
     imageC.setBackgroundResource(R.drawable.c); 
     imageD.setBackgroundResource(R.drawable.d); 
     imageE.setBackgroundResource(R.drawable.e); 
     imageF.setBackgroundResource(R.drawable.f); 
    } 
    else 
    { 
     imageA.setBackgroundResource(R.drawable.aa);  
     imageB.setBackgroundResource(R.drawable.bb); 
     imageC.setBackgroundResource(R.drawable.cc); 
     imageD.setBackgroundResource(R.drawable.dd); 
     imageE.setBackgroundResource(R.drawable.ee); 
     imageF.setBackgroundResource(R.drawable.ff); 
    } 



    imageA.setId(1); 
    imageA.setTag("a"); 
    paramsA = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); //The WRAP_CONTENT parameters can be replaced by an absolute width and height or the FILL_PARENT option)     
    imageA.setLayoutParams(paramsA); 
    imageA.setOnTouchListener(this); 
    //Log.d("GameActivity", "") 



    imageB.setId(2); 
    imageB.setTag("b"); 
    paramsB = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); //The WRAP_CONTENT parameters can be replaced by an absolute width and height or the FILL_PARENT option) 
    imageB.setLayoutParams(paramsB); 
    imageB.setOnTouchListener(this); 



    imageC.setId(3); 
    imageC.setTag("c"); 
    paramsC = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); //The WRAP_CONTENT parameters can be replaced by an absolute width and height or the FILL_PARENT option) 
    imageC.setLayoutParams(paramsC); 
    imageC.setOnTouchListener(this); 


    imageD.setId(4); 
    imageD.setTag("d"); 
    paramsD = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); //The WRAP_CONTENT parameters can be replaced by an absolute width and height or the FILL_PARENT option) 
    imageD.setLayoutParams(paramsD); 
    imageD.setOnTouchListener(this); 


    imageE.setId(5); 
    imageE.setTag("e"); 
    paramsE = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); //The WRAP_CONTENT parameters can be replaced by an absolute width and height or the FILL_PARENT option) 
    imageE.setLayoutParams(paramsE); 
    imageE.setOnTouchListener(this); 

    imageF.setId(6); 
    imageF.setTag("f"); 
    paramsF = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); //The WRAP_CONTENT parameters can be replaced by an absolute width and height or the FILL_PARENT option) 
    imageF.setLayoutParams(paramsF); 
    imageF.setOnTouchListener(this); 
    setupPieces(); 


    // Set the hardware buttons to control the music 
    this.setVolumeControlStream(AudioManager.STREAM_MUSIC); 
    // Load the sound 
    soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0); 
    soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() 
    { 
     @Override 
     public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { 

      loaded = true; 
     } 
    }); 

    gameFinishSoundId = soundPool.load(this, R.raw.bells, 1); 
    correctPieceAttachSoundId= soundPool.load(this, R.raw.bell, 1); 

} 

public void playSound(int soundId) 
{ 
    AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); 
    float actualVolume = (float) audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
    float maxVolume = (float) audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
    float volume = actualVolume/maxVolume; 
    // Is the sound loaded already? 
    if (loaded) 
    { 
     soundPool.play(soundId, volume, volume, 1, 0, 1.0f); 
    } 
} 

public void onConfigurationChanged(Configuration newConfig) 
{ 
    super.onConfigurationChanged(newConfig); 

    // Checks the orientation of the screen 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 
    { 
//  Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); 
    } 
    else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
    { 
//  Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); 
    } 
// Toast.makeText(this, "in OnConfiguaration Changed", Toast.LENGTH_SHORT).show(); 
    isPortait = (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) ? false : true; 
    ((RelativeLayout)imageA.getParent()).removeAllViews(); 
    Log.d("GameActivity", "in onconfigurationChanged"); 
    setupPieces(); 
} 
public void setupPieces() 
{ 
    RelativeLayout relataivelayoutLayout = new RelativeLayout(this); 
    Display display = getWindowManager().getDefaultDisplay(); 
    height = display.getHeight(); 
    width = display.getWidth(); 



    if(!isPortait) 
    { 
     paramsA.leftMargin = 10; //Your X coordinate 
     paramsA.topMargin = 30; //Your Y coordinate 
    } 
    else 
    { 
     paramsA.leftMargin = 30; //Your X coordinate 
     paramsA.topMargin = 10; //Your Y coordinate 
    } 


    imageA.setLayoutParams(paramsA); 
    imageA.setOnTouchListener(this); 
    //Log.d("GameActivity", "") 


    if(!isPortait) 
    { 
     paramsB.leftMargin = 650; //Your X coordinate 
     paramsB.topMargin = 300; //Your Y coordinate 
    } 
    else 
    { 
     paramsB.leftMargin = 300; //Your X coordinate 
     paramsB.topMargin = 750; //Your Y coordinate 
    } 
    imageB.setLayoutParams(paramsB); 
    imageB.setOnTouchListener(this); 


    if(!isPortait) 
    { 
     paramsC.leftMargin = 400; //Your X coordinate 
     paramsC.topMargin = 380; //Your Y coordinate 
    } 
    else 
    { 
     paramsC.leftMargin = 400; //Your X coordinate 
     paramsC.topMargin = 350; //Your Y coordinate 
    } 
    imageC.setLayoutParams(paramsC); 
    imageC.setOnTouchListener(this); 


    if(!isPortait) 
    { 
     paramsD.leftMargin = 750; //Your X coordinate 
     paramsD.topMargin = 20; //Your Y coordinate 
    } 
    else 
    { 
     paramsD.leftMargin = 20; //Your X coordinate 
     paramsD.topMargin = 750; //Your Y coordinate 
    } 
    imageD.setLayoutParams(paramsD); 
    imageD.setOnTouchListener(this); 


    if(!isPortait) 
    { 
     paramsE.leftMargin = 900; //Your X coordinate 
     paramsE.topMargin = 400; //Your Y coordinate 
    } 
    else 
    { 
     paramsE.leftMargin = 475; //Your X coordinate 
     paramsE.topMargin = 700; //Your Y coordinate 
    } 
    imageE.setLayoutParams(paramsE); 
    imageE.setOnTouchListener(this); 


    if(!isPortait) 
    { 
     paramsF.leftMargin = 90; //Your X coordinate 
     paramsF.topMargin = 300; //Your Y coordinate 
    } 
    else 
    { 
     paramsF.leftMargin = 90; //Your X coordinate 
     paramsF.topMargin = 300; //Your Y coordinate 
    } 
    imageF.setLayoutParams(paramsF); 
    imageF.setOnTouchListener(this); 
    ImageInfo imageAinfo = new ImageInfo(imageA.getId(),imageA,1,2); 
    imageInfoArray[0] = imageAinfo; 
    ImageInfo imageBinfo = new ImageInfo(imageB.getId(),imageB,1,3); 
    imageInfoArray[1] = imageBinfo; 
    ImageInfo imageCinfo = new ImageInfo(imageC.getId(),imageC,2,4); 
    imageInfoArray[2] = imageCinfo; 
    ImageInfo imageDinfo = new ImageInfo(imageD.getId(),imageD,3,5); 
    imageInfoArray[3] = imageDinfo; 
    ImageInfo imageEinfo = new ImageInfo(imageE.getId(),imageE,4,6); 
    imageInfoArray[4] = imageEinfo; 
    ImageInfo imageFinfo = new ImageInfo(imageF.getId(),imageF,5,6); 
    imageInfoArray[5] = imageFinfo; 



    relataivelayoutLayout.addView(imageA); 
    relataivelayoutLayout.addView(imageB); 
    relataivelayoutLayout.addView(imageC); 
    relataivelayoutLayout.addView(imageD); 
    relataivelayoutLayout.addView(imageE); 
    relataivelayoutLayout.addView(imageF); 


    setContentView(relataivelayoutLayout); 


} 
private void updatePosition(int id) 
{ 
    if(flag[imageInfoArray[id-1].id]) 
     return; 
    flag[imageInfoArray[id-1].id] = true; 

    RelativeLayout.LayoutParams param = (RelativeLayout.LayoutParams)imageInfoArray[id-1].imageView.getLayoutParams(); 
    param.leftMargin = imageInfoArray[id-1].imageView.getLeft() + diffX; 
    param.topMargin = imageInfoArray[id-1].imageView.getTop() + diffY; 
    imageInfoArray[id-1].imageView.setLayoutParams(param); 
    if(imageInfoArray[id-1].isTopConnected) 
     updatePosition(imageInfoArray[id-1].topPieceId); 
    if(imageInfoArray[id-1].isBottomConnected) 
     updatePosition(imageInfoArray[id-1].bottomPieceId); 
    return; 
} 
@Override 
public boolean onTouch(View v, MotionEvent event) 
{ 

    if(v instanceof ImageView) 
    { 

     ImageView imageView = (ImageView) v; 
     ImageInfo imageInfo = imageInfoArray[imageView.getId()-1]; 

     switch (event.getAction() & MotionEvent.ACTION_MASK) 
     { 

      case MotionEvent.ACTION_DOWN: 

       touchStartX = (int) event.getRawX(); 
       touchStartY = (int) event.getRawY(); 
       imageX = imageView.getLeft(); 
       imageY = imageView.getTop(); 
       //Toast.makeText(this, "x = "+event.getRawX()+" y = "+event.getRawY(), Toast.LENGTH_SHORT).show(); 
       break; 

      case MotionEvent.ACTION_UP: 

       touchStartX = (int) event.getRawX(); 
       touchStartY = (int) event.getRawY(); 
       imageX = imageView.getLeft(); 
       imageY = imageView.getTop(); 
       int id = imageInfo.id; 
       while(imageInfo.isTopConnected) 
       { 
        if(imageInfo.id == imageInfo.topPieceId) 
         break; 
        imageInfo = imageInfoArray[imageInfo.topPieceId-1];      
       } 
       if(!imageInfo.isTopConnected) 
       { 
        imageView = imageInfo.imageView; 
        int topConnectingPieceId = imageInfo.topPieceId; 
        int topConnectingX=0,topConnectingY=0; 
        topConnectingX = imageInfo.calculateTopX(imageView.getLeft(), imageView.getId()); 
        topConnectingY = imageInfo.calculateTopY(imageView.getTop(), imageView.getId()); 


        ImageInfo topImageInfo = imageInfoArray[topConnectingPieceId-1]; 
        int bottomConnectingX = topImageInfo.calculateBottomX(topImageInfo.imageView.getLeft(),topConnectingPieceId); 
        int bottomConnectingY = topImageInfo.calculateBottomY(topImageInfo.imageView.getTop(),topConnectingPieceId); 
        diffX = (bottomConnectingX-topConnectingX); 
        diffY = (bottomConnectingY-topConnectingY); 
        if(Math.abs(diffX)<=20 && Math.abs(diffY)<=20) 
        { 
         for(int i=0;i<7;i++) 
          flag[i]=false; 
         updatePosition(imageInfo.id); 
         imageInfo.setIsTopConnected(true); 
         topImageInfo.setIsBottomConnected(true); 
         attachedPieces++; 
         if(attachedPieces==5) 
         { 
          setupFinishDialogue(); 
          playSound(gameFinishSoundId); 
         } 
         else 
          playSound(correctPieceAttachSoundId); 
         break; 
        } 
       } 
       imageInfo = imageInfoArray[id-1]; 
       while(imageInfo.isBottomConnected) 
       { 
        if(imageInfo.id == imageInfoArray[imageInfo.bottomPieceId-1].id) 
         break; 
        imageInfo = imageInfoArray[imageInfo.bottomPieceId-1];      
       } 
       imageView = imageInfo.imageView; 
       if(!imageInfo.isBottomConnected) 
       { 
        int topConnectingX=0,topConnectingY=0; 
        int bottomConnectingX = imageInfo.calculateBottomX(imageView.getLeft(), imageView.getId()); 
        int bottomConnectingY = imageInfo.calculateBottomY(imageView.getTop(), imageView.getId()); 
        int bottomConnectingPieceId = imageInfo.bottomPieceId; 
        ImageInfo bottomImageInfo = imageInfoArray[bottomConnectingPieceId-1]; 
        topConnectingX = bottomImageInfo.calculateTopX(bottomImageInfo.imageView.getLeft(),bottomConnectingPieceId); 
        topConnectingY = bottomImageInfo.calculateTopY(bottomImageInfo.imageView.getTop(), bottomConnectingPieceId); 
        diffX = (topConnectingX-bottomConnectingX); 
        diffY = (topConnectingY-bottomConnectingY); 
        if(Math.abs(diffX)<=20 && Math.abs(diffY)<=20) 
        { 
         for(int i=0;i<7;i++) 
          flag[i]=false; 
         updatePosition(imageInfo.id); 
         imageInfo.setIsBottomConnected(true); 
         bottomImageInfo.setIsTopConnected(true); 
         attachedPieces++; 
         if(attachedPieces==5) 
         { 
          setupFinishDialogue(); 
          playSound(gameFinishSoundId); 
         } 
         else 
          playSound(correctPieceAttachSoundId); 
        } 
       } 

       break; 

      case MotionEvent.ACTION_MOVE: 

       diffX = (int) (event.getRawX() - touchStartX); 
       diffY = (int) (event.getRawY() - touchStartY); 
       touchStartX = (int)event.getRawX(); 
       touchStartY = (int)event.getRawY(); 

       for(int i=0;i<7;i++) 
        flag[i]=false;     
       updatePosition(imageInfo.id);  
       break; 

      default: 
       break; 
     } 

    } 

    return true; 
} 

void lockOrientation() 
{ 
    switch (getResources().getConfiguration().orientation) 
    { 
     case Configuration.ORIENTATION_PORTRAIT: 
      if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.FROYO) 
      { 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
      } 
      else 
      { 
       int rotation = getWindowManager().getDefaultDisplay().getRotation(); 
       if(rotation == android.view.Surface.ROTATION_90|| rotation == android.view.Surface.ROTATION_180) 
       { 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
       } 
       else 
       { 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
       } 
      } 
      break; 

     case Configuration.ORIENTATION_LANDSCAPE: 
      if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.FROYO) 
      { 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
      } 
      else 
      { 
       int rotation = getWindowManager().getDefaultDisplay().getRotation(); 
       if(rotation == android.view.Surface.ROTATION_0 || rotation == android.view.Surface.ROTATION_90){ 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
       } 
       else 
       { 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
       } 
      } 
      break; 
    } 
} 

void setupFinishDialogue() 
{ 
    /*if(getWindowManager().getDefaultDisplay().getRotation()==3) 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    else if(getWindowManager().getDefaultDisplay().getRotation()==1) 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
    else if(getWindowManager().getDefaultDisplay().getRotation()==2) 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
    else setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);*/ 


    lockOrientation(); 

    AlertDialog.Builder builderForAlertBox = new AlertDialog.Builder(this); 
    builderForAlertBox.setCancelable(false).setMessage("Good Job!").setPositiveButton("Restart", dialogClickListner).setNegativeButton("Quit", dialogClickListner). 
    setCancelable(true).show(); 
} 
DialogInterface.OnClickListener dialogClickListner = new DialogInterface.OnClickListener() 
{  
    public void onClick(DialogInterface dialog, int which) 
    { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 
     switch (which) { 
     case DialogInterface.BUTTON_POSITIVE: 
      finish(); 
      Intent intent = new Intent(getApplicationContext(),GameActivity.class); 
      startActivity(intent); 
      break; 

     case DialogInterface.BUTTON_NEGATIVE: 
      finish(); 
     default: 
      break; 
     } 

    } 
}; 

}

ImageInfo Classe

package com.example.JigSawPuzzle; 

import android.widget.ImageView; 
import android.widget.Toast; 

public class ImageInfo 
{ 
ImageView imageView; 
int imageATopLeftDifferenceX = -1; 
int imageATopLeftDifferenceY = -1; 
int imageABottomRightDifferenceX = 113; 
int imageABottomRightDifferenceY = 140; 

int imageBTopLeftDifferenceX = 0; 
int imageBTopLeftDifferenceY = 0; 
int imageBBottomRightDifferenceX = 0; 
int imageBBottomRightDifferenceY = 111; 

int imageCTopLeftDifferenceX = 14; 
int imageCTopLeftDifferenceY = 0; 
int imageCBottomRightDifferenceX = 0; 
int imageCBottomRightDifferenceY = 88; 

int imageDTopLeftDifferenceX = 92; 
int imageDTopLeftDifferenceY = 2; 
int imageDBottomRightDifferenceX = 0; 
int imageDBottomRightDifferenceY = 70; 

/*int imageETopLeftDifferenceX = 0; 
int imageETopLeftDifferenceY = 0; 
int imageEBottomRightDifferenceX = 55; 
int imageEBottomRightDifferenceY = 112;*/ 
int imageETopLeftDifferenceX = 55; 
int imageETopLeftDifferenceY = 112; 
int imageEBottomRightDifferenceX = 0; 
int imageEBottomRightDifferenceY = 0; 

/*int imageFTopLeftDifferenceX = 0; 
int imageFTopLeftDifferenceY = 26; 
int imageFBottomRightDifferenceX = 0; 
int imageFBottomRightDifferenceY = 109; 
int id,topPieceId,bottomPieceId;*/ 
int imageFTopLeftDifferenceX = 0; 
int imageFTopLeftDifferenceY = 109; 
int imageFBottomRightDifferenceX = 0; 
int imageFBottomRightDifferenceY = 26; 
int id,topPieceId,bottomPieceId; 

boolean isTopConnected = false; 
boolean isBottomConnected = false; 
public ImageInfo(int id,ImageView imageView,int topPieceId,int bottomPieceId) 
{ 
    this.topPieceId = topPieceId; 
    this.bottomPieceId = bottomPieceId; 
    this.imageView = imageView; 
    this.id = id; 
    if(id==1) 
     isTopConnected = true; 
    else if(id==6) 
     isBottomConnected = true; 
    if(GameActivity.screenInches>9.0) 
     initializePiecesInfo(); 
} 
private void initializePiecesInfo() 
{ 

    imageATopLeftDifferenceX = 0; 
    imageATopLeftDifferenceY = 0; 
    imageABottomRightDifferenceX = 150; 
    imageABottomRightDifferenceY = 184; 

    imageBTopLeftDifferenceX = 0; 
    imageBTopLeftDifferenceY = 0; 
    imageBBottomRightDifferenceX = 0; 
    imageBBottomRightDifferenceY = 148; 

    imageCTopLeftDifferenceX = 23; 
    imageCTopLeftDifferenceY = 0; 
    imageCBottomRightDifferenceX = 0; 
    imageCBottomRightDifferenceY = 115; 

    imageDTopLeftDifferenceX = 121; 
    imageDTopLeftDifferenceY = 0; 
    imageDBottomRightDifferenceX = 0; 
    imageDBottomRightDifferenceY = 91; 

    /*int imageETopLeftDifferenceX = 0; 
    int imageETopLeftDifferenceY = 0; 
    int imageEBottomRightDifferenceX = 55; 
    int imageEBottomRightDifferenceY = 112;*/ 
    imageETopLeftDifferenceX = 74; 
    imageETopLeftDifferenceY = 147; 
    imageEBottomRightDifferenceX = 0; 
    imageEBottomRightDifferenceY = 0; 

    /*int imageFTopLeftDifferenceX = 0; 
    int imageFTopLeftDifferenceY = 26; 
    int imageFBottomRightDifferenceX = 0; 
    int imageFBottomRightDifferenceY = 109; 
    int id,topPieceId,bottomPieceId;*/ 
    imageFTopLeftDifferenceX = 0; 
    imageFTopLeftDifferenceY = 144; 
    imageFBottomRightDifferenceX = 0; 
    imageFBottomRightDifferenceY = 26; 
} 

int calculateTopX(int realX,int id) 
{ 
    if(id==2) 
     return realX+imageBTopLeftDifferenceX; 
    if(id==3) 
     return realX+imageCTopLeftDifferenceX; 
    if(id==4) 
     return realX+imageDTopLeftDifferenceX; 
    if(id==5) 
     return realX+imageETopLeftDifferenceX; 
    if(id==6) 
     return realX+imageFTopLeftDifferenceX; 
    return realX; 

} 
int calculateTopY(int realY,int id) 
{ 
    if(id==2) 
     return realY+imageBTopLeftDifferenceY; 
    if(id==3) 
     return realY+imageCTopLeftDifferenceY; 
    if(id==4) 
     return realY+imageDTopLeftDifferenceY; 
    if(id==5) 
     return realY+imageETopLeftDifferenceY; 
    if(id==6) 
     return realY+imageFTopLeftDifferenceY; 
    return realY; 
} 

int calculateBottomX(int realX,int id) 
{ 
    if(id==1) 
     return realX+imageABottomRightDifferenceX; 
    if(id==2) 
     return realX+imageBBottomRightDifferenceX; 
    if(id==3) 
     return realX+imageCBottomRightDifferenceX; 
    if(id==4) 
     return realX+imageDBottomRightDifferenceX; 
    if(id==5) 
     return realX+imageEBottomRightDifferenceX; 
    return realX+imageFBottomRightDifferenceX;  
} 
int calculateBottomY(int realY,int id) 
{ 
    if(id==1) 
     return realY+imageABottomRightDifferenceY; 
    if(id==2) 
     return realY+imageBBottomRightDifferenceY; 
    if(id==3) 
     return realY+imageCBottomRightDifferenceY; 
    if(id==4) 
     return realY+imageDBottomRightDifferenceY; 
    if(id==5) 
     return realY+imageEBottomRightDifferenceY; 
    return realY+imageFBottomRightDifferenceY; 
} 
void setIsTopConnected(boolean isTopConnected) 
{ 
    this.isTopConnected = isTopConnected; 
} 
void setIsBottomConnected(boolean isBottomConnected) 
{ 
    this.isBottomConnected = isBottomConnected; 
} 

} 
+0

penso che non si può attuarla esatto .... immagini potrebbe ignorare si può perdere la linea tra il rosso e il verde – Pragnani

+0

Ma ci deve essere una soluzione giusta? Ora controllo solo se è una scheda da 7 pollici o una scheda da 10 pollici. Devo controllare anche se una scheda 7/10inch e anche diverse risoluzioni? – Tahlil

+1

Puoi caricare esattamente le due immagini? se ogni forma in un'immagine separata con dimensioni si adatta perfettamente all'immagine. Connetterli sarà facile. Se entrambe le forme sono nella stessa immagine, avrai bisogno di più lavoro da fare. Inoltre, carica il codice che stai utilizzando per collegarlo per aiutarti a migliorare – iTech

risposta

18

Date le immagini che hai fornito è semplice per collegarli in modo generico, perché le immagini hanno la stessa larghezza e hanno uno sfondo trasparente, ecco l'idea:

1- È necessario la distanza sovrapposizione tra le due immagini, che è possibile calcolare sia dal basso o immagine in alto

enter image description here

La linea verde nella foto in basso dovrebbe essere uguale alla linea rossa nella parte superiore picture

bottom image

Dato che le immagini hanno sfondo trasparente è possibile calcolare questa distanza facilmente, userò l'immagine in basso qui.

L'idea è di controllare ogni pixel nell'ultima colonna della bitmap inferiore (cioè larghezza - 1) e fermarsi una volta raggiunto un pixel non trasparente.

private int getOverlapDistance(Bitmap bottomBitmap) { 
    int height = bottomBitmap.getHeight(); 
    int width = bottomBitmap.getWidth(); 
    int distance = 0; 
    for (int i = 0; i < height; i++) { 
     if (Color.alpha(bottomBitmap.getPixel(width - 1, i)) != 0) { 
      distance = (i + 1); 
      break; 
     } 
    } 
    return distance; 
} 

per collegarli si può fare qualcosa di simile (ammesso che abbiate separata ImageView per la parte superiore e l'immagine in basso):

bitmap = ((BitmapDrawable) bottomImage.getDrawable()).getBitmap(); 
int overlapDistance = getOverlapDistance(bitmap); 
bottomImage.setTop(topImage.getBottom() - overlapDistance); 

In realtà ho provato questo con una semplice attività e si sta lavorando, qui è come guardare come prima e dopo aver collegato le due immagini:

Images before connecting

ho appena eseguire quanto sopra cod e quando il pulsante viene cliccato connect

After connecting