Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to divide an Fragment in Android into Two Colors

First I would like to say please do not mark this question a duplicate. It differs from other posts in one critical way. Does anybody know a way that I may divide the color of fragment into two colors right down the middle? Thanks everyone!

like image 411
Ethan Avatar asked Feb 22 '16 15:02

Ethan


2 Answers

here is sample to use gradient

  float in[] = new float[] {0f,1f};
    TextView textView= (TextView)findViewById(R.id.tv_test);
    Shader shader = new LinearGradient(
            0, textView.getTextSize(), textView.getWidth(), textView.getHeight(), new int[]{Color.RED, Color.BLUE},in,
            Shader.TileMode.CLAMP);
    textView.getPaint().setShader(shader);

To achieve Second Simply user Framelayout xml

 <FrameLayout
    android:id="@+id/fl_test"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <LinearLayout
        android:id="@+id/ll_test"
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:background="@android:color/white"
        android:orientation="horizontal">

        <View
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@android:color/holo_red_dark" />

        <View
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@android:color/holo_blue_dark" />
    </LinearLayout>

    <TextView
        android:id="@+id/tv_test2"
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:layout_gravity="center"
        android:background="@android:color/transparent"
        android:gravity="center"
        android:text="A"
        android:textColor="@android:color/white"
        android:textSize="100sp" />

</FrameLayout>

For Third one you have to write little and do some work on pixel level

<TextView
    android:id="@+id/tv_test"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="H"
    android:textColor="@android:color/holo_red_dark"
    android:textSize="100sp" />

<FrameLayout
    android:id="@+id/fl_test"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <LinearLayout
        android:id="@+id/ll_test"
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:background="@android:color/white"
        android:orientation="horizontal">

        <View
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@android:color/holo_red_dark" />

        <View
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@android:color/holo_blue_dark" />
    </LinearLayout>

    <TextView
        android:id="@+id/tv_test2"
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:layout_gravity="center"
        android:background="@android:color/transparent"
        android:gravity="center"
        android:text="A"
        android:textColor="@android:color/white"
        android:textSize="100sp" />

</FrameLayout>

<ImageView
    android:id="@+id/iv_test"
    android:layout_width="200dp"
    android:layout_height="200dp" />

public class MainActivity extends AppCompatActivity {
View linearLayout;
View tvTest2;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    TextView textView = (TextView) findViewById(R.id.tv_test);
    Shader shader = new LinearGradient(
            0, textView.getTextSize()/2, textView.getTextSize(), textView.getTextSize()/2,Color.RED, Color.BLUE,
            Shader.TileMode.CLAMP);
    textView.getPaint().setShader(shader);

     linearLayout =  findViewById(R.id.ll_test);
     tvTest2 =  findViewById(R.id.tv_test2);

}

@Override
protected void onResume() {
    super.onResume();

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            ImageView imageView = (ImageView) findViewById(R.id.iv_test);

            Bitmap b1 = getBitmapFromView(linearLayout);
            Bitmap b2 = getBitmapFromView(tvTest2);
            imageView.setImageBitmap(textEffect(b1, b2));
        }
    },2000);

}

public Bitmap textEffect(Bitmap image, Bitmap text) {
    if (image.getWidth() != text.getWidth() ||
            image.getHeight() != text.getHeight()) {
        throw new IllegalArgumentException("Dimensions are not the same!");
    }

    for (int y = 0; y < image.getHeight(); ++y) {
        for (int x = 0; x < image.getWidth(); ++x) {
            int textPixel = text.getPixel(x, y);
            int imagePixl = image.getPixel(x,y);

            int red = Color.red(textPixel);
            int blue = Color.blue(textPixel);
            int green = Color.green(textPixel);
            int alpha = Color.alpha(textPixel);

            Log.i("TAG", "textEffect: "+x+"-"+y+",-->"+red+","+blue+","+green+","+alpha);

            /*Since text color is white so give the color of background to it 
            * else make it white*/
            if (red == 255) {
                if (blue == 255) {
                    if (green == 255) {
                        image.setPixel(x, y, imagePixl);
                    }else
                    {
                        image.setPixel(x, y, textPixel);
                    }
                }else{
                    image.setPixel(x, y, textPixel);
                }
            }else
            {
                image.setPixel(x, y, textPixel);
            }
        }
    }
    return image;
}


public static Bitmap getBitmapFromView(View view) {
    //Define a bitmap with the same size as the view
    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
    //Bind a canvas to it
    Canvas canvas = new Canvas(returnedBitmap);
    //Get the view's background
    Drawable bgDrawable = view.getBackground();
    if (bgDrawable != null)
        //has background drawable, then draw it on the canvas
        bgDrawable.draw(canvas);
    else
        //does not have background drawable, then draw white background on the canvas
        canvas.drawColor(Color.WHITE);
    // draw the view on the canvas
    view.draw(canvas);
    //return the bitmap
    return returnedBitmap;
}
}

What you exactly want to achieve ??
First one
Second one
Third one ??
enter image description here

like image 83
Lokesh Tiwari Avatar answered Nov 26 '22 00:11

Lokesh Tiwari


Define a TextView

<TextView
    android:id="@+id/tv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="12dp"
    android:text="O"
    android:textColor="#88022b54"
    android:textSize="250sp"
    android:textStyle="bold"
    android:shadowColor="#ff2e7cca"
    android:shadowDx="0"
    android:shadowDy="0"
    android:shadowRadius="1"/>

Then

Shader shader = new LinearGradient(
            0, mytv.getTextSize()/2, mytv.getTextSize(), mytv.getTextSize()/2,
            Color.RED, Color.BLUE,
            Shader.TileMode.CLAMP);
    mytv.getPaint().setShader(shader);
like image 30
statosdotcom Avatar answered Nov 26 '22 00:11

statosdotcom