How To Create Custom Component in android


How To Create Custom Componet in android


---------------------------------------------------------

public class CustomComponent1 extends RelativeLayout {
Button btnClose;
RelativeLayout relCustom;
ImageView imgClipart;
View v;
private static float MIN_ZOOM = 1f;

private static float MAX_ZOOM = 5f;

private float displayWidth;
private float displayHeight;

private float scaleFactor = 1.f;

// These constants specify the mode that we're in

private static int NONE = 0;

private static int DRAG = 1;

private static int ZOOM = 2;

private boolean dragged = false;
private int mode;

// These two variables keep track of the X and Y coordinate of the finger
// when it first

// touches the screen

private float startX = 0f;

private float startY = 0f;

// These two variables keep track of the amount we need to translate the
// canvas along the X

// and the Y coordinate

private float translateX = 0f;

private float translateY = 0f;

// These two variables keep track of the amount we translated the X and Y
// coordinates, the last time we

// panned.

private float previousTranslateX = 0f;

private float previousTranslateY = 0f;

private ScaleGestureDetector detector;

public CustomComponent1(Context context) {
super(context);
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

v = inflater.inflate(R.layout.customcomponent, CustomComponent1.this);

imgClipart = (ImageView) v.findViewById(R.id.imgClipart);
btnClose = (Button) v.findViewById(R.id.btnClose);
relCustom = (RelativeLayout) v.findViewById(R.id.relCustom);
detector = new ScaleGestureDetector(getContext(), new ScaleListener());
WindowManager wm = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();

displayWidth = display.getWidth();
displayHeight = display.getHeight();
relCustom.setOnTouchListener(new OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {

System.out.println("touch starts");

return false;
}
});

btnClose.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
System.out.println("Buttonclose----");
// v.setVisibility(View.GONE);
MainActivity.relative2.removeViewAt(0);

}
});
}

@Override
protected void onFinishInflate() {
// TODO Auto-generated method stub
super.onFinishInflate();

// ((Activity) getContext()).getLayoutInflater().inflate(
// R.layout.customcomponent, this);

System.out.println("inside custom ");
}

public void setImage() {
System.out.println("Inside image view show image ");
imgClipart.setImageResource(R.drawable.ic_launcher);

}

@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN:

mode = DRAG;

// We assign the current X and Y coordinate of the finger to startX
// and startY minus the previously translated

// amount for each coordinates This works even when we are
// translating the first time because the initial

// values for these two variables is zero.

startX = event.getX() - previousTranslateX;

startY = event.getY() - previousTranslateY;

break;

case MotionEvent.ACTION_MOVE:

translateX = event.getX() - startX;

translateY = event.getY() - startY;

// We cannot use startX and startY directly because we have adjusted
// their values using the previous translation values.

// This is why we need to add those values to startX and startY so
// that we can get the actual coordinates of the finger.

double distance = Math.sqrt(Math.pow(event.getX()
- (startX + previousTranslateX), 2)
+

Math.pow(event.getY() - (startY + previousTranslateY), 2)

);

if (distance > 0) {

dragged = true;

}
break;

case MotionEvent.ACTION_POINTER_DOWN:

mode = ZOOM;

break;

case MotionEvent.ACTION_UP:

mode = NONE;

dragged = false;

// All fingers went up, so let's save the value of translateX and
// translateY into previousTranslateX and

// previousTranslate

previousTranslateX = translateX;

previousTranslateY = translateY;

break;

case MotionEvent.ACTION_POINTER_UP:

mode = DRAG;

// This is not strictly necessary; we save the value of translateX
// and translateY into previousTranslateX

// and previousTranslateY when the second finger goes up

previousTranslateX = translateX;

previousTranslateY = translateY;

break;

}
detector.onTouchEvent(event);

// We redraw the canvas only in the following cases:

//

// o The mode is ZOOM

// OR

// o The mode is DRAG and the scale factor is not equal to 1 (meaning we
// have zoomed) and dragged is

// set to true (meaning the finger has actually moved)

if ((mode == DRAG && scaleFactor != 1f && dragged) || mode == ZOOM) {

invalidate();

}
return true;

}

@Override
public void dispatchDraw(Canvas canvas) {
super.onDraw(canvas);

canvas.save();

// We're going to scale the X and Y coordinates by the same amount
canvas.scale(this.scaleFactor, this.scaleFactor, this.detector.getFocusX(), this.detector.getFocusY());
//canvas.scale(scaleFactor, scaleFactor);

// If translateX times -1 is lesser than zero, let's set it to zero.
// This takes care of the left bound

if ((translateX * -1) < 0) {

translateX = 0;

}

// This is where we take care of the right bound. We compare translateX
// times -1 to (scaleFactor - 1) * displayWidth.

// If translateX is greater than that value, then we know that we've
// gone over the bound. So we set the value of

// translateX to (1 - scaleFactor) times the display width. Notice that
// the terms are interchanged; it's the same

// as doing -1 * (scaleFactor - 1) * displayWidth

else if ((translateX * -1) > (scaleFactor - 1) * displayWidth) {

translateX = (1 - scaleFactor) * displayWidth;

}

if (translateY * -1 < 0) {

translateY = 0;

}

// We do the exact same thing for the bottom bound, except in this case
// we use the height of the display

else if ((translateY * -1) > (scaleFactor - 1) * displayHeight) {

translateY = (1 - scaleFactor) * displayHeight;

}
// We need to divide by the scale factor here, otherwise we end up with
// excessive panning based on our zoom level

// because the translation amount also gets scaled according to how much
// we've zoomed into the canvas.

canvas.translate(translateX / scaleFactor, translateY / scaleFactor);

/* The rest of your canvas-drawing code */
super.dispatchDraw(canvas);
canvas.restore();
}

private class ScaleListener extends
ScaleGestureDetector.SimpleOnScaleGestureListener {

@Override
public boolean onScale(ScaleGestureDetector detector) {

scaleFactor *= detector.getScaleFactor();

scaleFactor = Math.max(MIN_ZOOM, Math.min(scaleFactor, MAX_ZOOM));

invalidate();

return true;

}

}
}


///////////////////////////////////////////////////////////////////////////////////////////////////////


public class MainActivity extends Activity {
static CustomComponent1 custom;
static RelativeLayout relative2;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        custom = new CustomComponent1(MainActivity.this);
        Button btnClip = (Button) findViewById(R.id.btnClip);
       relative2=(RelativeLayout) findViewById(R.id.relative2);
        btnClip.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
custom = new CustomComponent1(MainActivity.this);
custom.setImage();
LayoutParams myView1Params =  new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
custom.setLayoutParams(myView1Params);
relative2.addView(custom);

}
});
       
       
       // custom.setOnTouchListener((OnTouchListener) this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
   
    public static CustomComponent1 cus ()
    {
   
return custom;
   
    }
}