Saturday, October 4, 2014

StringBuilder example in java

The Java StringBuilder class represents string objects that can be changed. It contains methods such as append and insert that modify the string object. For example, the append method adds a string to the end of the StringBuilder object. The object is changed; no new object is created or returned. Generally use the StringBuilder class for string objects that will change.

There is mainly two way to append string.

Way – 1:

    String s = “Example”;
    s = s + ”  varemads”;
    system.out.println(s);

Output give you “Hello World”, let’s be different from the rest and think about making the code more efficient.

Way - 2:



    StringBuilder sb = new StringBuilder(“Example”);
    sb.append(” varemads”);
    system.out.println(sb);

well… thats it!! You’ll get your “Hello World” but in a more efficient way.

It is recommended to use StringBuilder whenever possible because
it is faster than StringBuffer. However if thread safety is

necessary the best option is StringBuffer objects.


http://www.varemads.com/java-2/java-use-stringbuilder/

Difference between Stringbuffer and Stringbuilder

Hope this post is helpful for you...



Stringbuffer and StringBuilder in java

The most important difference between String and StringBuffer/StringBuilder in java is that String object is immutable whereas StringBuffer/StringBuilder objects are mutable.

String

One important characteristic of the Java String class is that the string object cannot be changed. Even though the String class contains methods such as replace andtoUpperCase, the object remains unchanged. Instead, these methods return a new String object. For example, the toLowerCase method returns a new String object with all of the characters in lower case. As a guideline, use Java String for string objects that will not change.

StringBuilder

The Java StringBuilder class represents string objects that can be changed. It contains methods such as append and insert that modify the string object. For example, the append method adds a string to the end of the StringBuilder object. The object is changed; no new object is created or returned. Generally use the StringBuilder class for string objects that will change.

StringBuffer

The Java StringBuffer class is just like StringBuilder. The primary difference is that StringBuffer issynchronized. In other words, multiple threads can safely process StringBuffer objects. However, additional overhead is required to make StringBuffer synchronized. So StringBuffer is slower than StringBuilder. You should use the StringBuffer class for string objects that will be changed by multiple threads of execution.

The StringBuilder class was introduced as of Java 5 and the main difference between the StringBuffer and StringBuilder is that StringBuilders methods are not thread safe(not Synchronised).

StringBuffer and StringBuilder have the same methods with one difference and that’s of synchronization. StringBuffer is synchronized( which means it is thread safe and hence you can use it when you implement threads for your methods) whereas StringBuilder is not synchronized( which implies it isn’t thread safe).


So, if you aren’t going to use threading then use the StringBuilder class as it’ll be more efficient than StringBuffer due to the absence of synchronization.

It is recommended to use StringBuilder whenever possible because it is faster than StringBuffer. However if thread safety is necessary the best option is StringBuffer objects.

http://www.varemads.com/java-2/java-difference-stringbuffer-stringbuilder/

Here is Example of StringBuilder in JAVA

Hope this post is helpful for you...


Wednesday, October 1, 2014

Circular Imageview in android

In this post create circular ImageView in android. For create circular imageview here we use custom class named as CircularImageView.

Create CircularImageView.java in your project package.

public class CircularImageView extends ImageView {
 private int borderWidth;
 private int canvasSize;
 private Bitmap image;
 private Paint paint;
 private Paint paintBorder;

 public CircularImageView(final Context context) {
  this(context, null);
 }

 public CircularImageView(Context context, AttributeSet attrs) {
  this(context, attrs, R.attr.circularImageViewStyle);
 }

 public CircularImageView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);

  paint = new Paint();
  paint.setAntiAlias(true);

  paintBorder = new Paint();
  paintBorder.setAntiAlias(true);

  TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.CircularImageView, defStyle, 0);

  if(attributes.getBoolean(R.styleable.CircularImageView_border, true)) {
   int defaultBorderSize = (int) (4 * getContext().getResources().getDisplayMetrics().density + 0.5f);
   setBorderWidth(attributes.getDimensionPixelOffset(R.styleable.CircularImageView_border_width, defaultBorderSize));
   setBorderColor(attributes.getColor(R.styleable.CircularImageView_border_color, Color.WHITE));
  }

  if(attributes.getBoolean(R.styleable.CircularImageView_shadow, false))
   addShadow();
 }

 public void setBorderWidth(int borderWidth) {
  this.borderWidth = borderWidth;
  this.requestLayout();
  this.invalidate();
 }

 public void setBorderColor(int borderColor) {
  if (paintBorder != null)
   paintBorder.setColor(borderColor);
  this.invalidate();
 }

 public void addShadow() {
  setLayerType(LAYER_TYPE_SOFTWARE, paintBorder);
  paintBorder.setShadowLayer(4.0f, 0.0f, 2.0f, Color.BLACK);
 }

 @Override
 public void onDraw(Canvas canvas) {
  image = drawableToBitmap(getDrawable());

  if (image != null) {

   canvasSize = canvas.getWidth();
   if(canvas.getHeight() < canvasSize)
    canvasSize = canvas.getHeight();

   BitmapShader shader = new BitmapShader(Bitmap.createScaledBitmap(image, canvasSize, canvasSize, false), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
   paint.setShader(shader);

   int circleCenter = (canvasSize - (borderWidth * 2)) / 2;
   canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, ((canvasSize - (borderWidth * 2)) / 2) + borderWidth - 4.0f, paintBorder);
   canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, ((canvasSize - (borderWidth * 2)) / 2) - 4.0f, paint);
  }
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  int width = measureWidth(widthMeasureSpec);
  int height = measureHeight(heightMeasureSpec);
  setMeasuredDimension(width, height);
 }

 private int measureWidth(int measureSpec) {
  int result = 0;
  int specMode = MeasureSpec.getMode(measureSpec);
  int specSize = MeasureSpec.getSize(measureSpec);

  if (specMode == MeasureSpec.EXACTLY) {
   result = specSize;
  } else if (specMode == MeasureSpec.AT_MOST) {
   result = specSize;
  } else {
   result = canvasSize;
  }

  return result;
 }

 private int measureHeight(int measureSpecHeight) {
  int result = 0;
  int specMode = MeasureSpec.getMode(measureSpecHeight);
  int specSize = MeasureSpec.getSize(measureSpecHeight);

  if (specMode == MeasureSpec.EXACTLY) {
   result = specSize;
  } else if (specMode == MeasureSpec.AT_MOST) {
   result = specSize;
  } else {
   result = canvasSize;
  }

  return (result + 2);
 }

 public Bitmap drawableToBitmap(Drawable drawable) {
  if (drawable == null) {
   return null;
  } else if (drawable instanceof BitmapDrawable) {
   return ((BitmapDrawable) drawable).getBitmap();
  }

  Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
    drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
  Canvas canvas = new Canvas(bitmap);
  drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
  drawable.draw(canvas);

  return bitmap;
 }
}

Now create attr.xml under res/values/ folder in your project.

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="CircularImageView">
        <attr name="border" format="boolean"></attr>
        <attr name="border_width" format="dimension"></attr>
        <attr name="border_color" format="color"></attr>
        <attr name="shadow" format="boolean"></attr>
    </declare-styleable>
   
    <declare-styleable name="Theme">
        <attr name="circularImageViewStyle" format="reference"></attr>
    </declare-styleable>

</resources>

In your layout file add imageview like below code

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:gravity="center">

    <**YOUR PACKAGE NAME**.CircularImageView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:src="@drawable/ic_launcher"/>
 
</LinearLayout>

Output for above code is like below


Hope this post is helpful for you...