2013-02-05 77 views
11

我想在android中連接2個圖像。例如,在android中連接2個圖像

enter image description here

enter image description here

我想他們是這樣的, enter image description here

我已經通過硬編碼做到了。首先,我找到綠色圖像的左上角,然後找到綠色一側的最左下角點。我使用觸摸事件的event.gerRawX()和event.getRawY()參數進行操作。現在我知道這兩點之間x和y的距離。我也爲紅色做類似的事情。現在,當綠色片移動到接近紅色時,我只是計算紅色片的左上角點是否接近綠色片的左下角。如果是的話,我將綠色/紅色翻譯成另一個。但是對於具有不同分辨率的相同尺寸的平板電腦或手機,此硬編碼計算應該失敗我只想知道我如何概括解決方案。謝謝。

編輯:我的GameActivity和ImageInfo類,我嘗試連接兩個圖像。我實際上有6個這樣的圖像。我想將它們連接起來。像圖像1將連接到圖像2和圖像2到3等等。

GameActivity類

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類

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

我認爲你不能準確執行用電子郵件....圖像可能會覆蓋您可能會錯過紅色和綠色 – Pragnani

+0

之間的線,但一定是有解決方案嗎?我現在只檢查它的7英寸標籤或10英寸標籤。我是否還應該檢查7/10英寸選項卡以及不同的分辨率? – Tahlil

+1

你可以上傳確切的兩張圖片嗎?如果每個形狀在大小適合的圖像單獨的圖像。連接它們將很容易。如果兩個形狀都在同一圖像中,則需要做更多工作。此外,上傳您當前使用的代碼連接它們以更好地幫助您 – iTech

回答

18

給你提供的是簡單的將它們連接在一個通用的方法,因爲圖像具有相同的寬度圖像和他們有透明背景,這裏有這個想法:

1-你需要兩個圖像,你可以從底部或頂部圖像計算之間的重疊距離

enter image description here

在底部的圖片綠線應當等於在頂部的紅色線圖片

bottom image

鑑於您的圖片具有透明背景,你可以很容易地計算出這個距離,我會在這裏使用底部的圖像。

這個想法是檢查底部位圖的最後一列(即寬度-1)中的每個像素,並在你點擊一個不透明的像素後停止。

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; 
} 

將它們連接起來,你可以這樣做(假設你有相應的頂部和底部的圖像分開ImageView):

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

其實我有一個簡單的活動嘗試這樣做,這是工作,在這裏是怎麼看起來像之前和連接兩個圖像後:

Images before connecting

我只是執行上面的鱈魚當按鈕connect點擊

After connecting