Horizontal ScrollView. Distribute the content in several lines. Hangman game

-3

I'm trying to solve the hangman game on android and my problem is that I have a HorizontalScrollView, which contains a Grid Layout.

I fill it with buttons, one for each letter of the alphabet.

My problem is that the buttons I put them all one behind another and I want to show it to me in several lines so that it is more visual and not having to be scrolling the Scroll bar to select the buttons.

If you need a photo or part of the code to clarify ask for it.

Thank you very much in advance!

    
asked by Javir Gallegos García 18.12.2018 в 20:16
source

2 answers

0

What you can do is use a recyclerView to generate the alphabet buttons using a Grid Layout.

here is an example obtained from Android RecyclerView Grid Layout Example

activity_main.xml

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

         

custom_view.xml

<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardCornerRadius="4dp"
card_view:cardMaxElevation="4dp"
card_view:cardElevation="2dp"
card_view:contentPadding="5dp"
>
<LinearLayout
    android:id="@+id/ll"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="3dp"
    >
    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textColor="#000"
        android:textSize="25dp"
        android:textStyle="bold"
        android:layout_margin="2dp"
        android:padding="10dp"
        android:layout_gravity="center"
        android:gravity="center"
        />
</LinearLayout>

MainActivity.java

import android.content.Context;

import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.Window; import android.widget.RelativeLayout;

public class MainActivity extends AppCompatActivity {     private Context mContext;

RelativeLayout mRelativeLayout;
private RecyclerView mRecyclerView;

private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;


@Override
protected void onCreate(Bundle savedInstanceState) {
    // Request window feature action bar
    requestWindowFeature(Window.FEATURE_ACTION_BAR);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Get the application context
    mContext = getApplicationContext();

    // Change the action bar color
    getSupportActionBar().setBackgroundDrawable(
            new ColorDrawable(Color.parseColor("#FF677589"))
    );

    // Get the widgets reference from XML layout
    mRelativeLayout = (RelativeLayout) findViewById(R.id.rl);
    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);

    // Initialize a new String array
    String[] animals = {
            "Aardvark",
            "Albatross",
            "Alligator",
            "Alpaca",
            "Ant",
            "Anteater",
            "Antelope",
            "Ape",
            "Armadillo",
            "Donkey",
            "Baboon",
            "Badger",
            "Barracuda",
            "Bear",
            "Beaver",
            "Bee"
    };

    /*
        GridLayoutManager
            A RecyclerView.LayoutManager implementations that lays out items in a grid.
            By default, each item occupies 1 span. You can change it by providing a custom
            GridLayoutManager.SpanSizeLookup instance via setSpanSizeLookup(SpanSizeLookup).
    */
    /*
        public GridLayoutManager (Context context, int spanCount)
            Creates a vertical GridLayoutManager

        Parameters
            context : Current context, will be used to access resources.
            spanCount : The number of columns in the grid
    */
    // Define a layout for RecyclerView
    mLayoutManager = new GridLayoutManager(mContext,3);
    mRecyclerView.setLayoutManager(mLayoutManager);

    // Initialize a new instance of RecyclerView Adapter instance
    mAdapter = new AnimalsAdapter(mContext,animals);

    // Set the adapter for RecyclerView
    mRecyclerView.setAdapter(mAdapter);

} }

AnimalsAdapter.java

import android.content.Context;

import android.graphics.Color; import android.graphics.EmbossMaskFilter; import android.graphics.drawable.GradientDrawable; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView;

import java.util.Random;

public class AnimalsAdapter extends RecyclerView.Adapter {     private String [] mDataSet;     private Context mContext;     private Random mRandom = new Random ();

public AnimalsAdapter(Context context,String[] DataSet){
    mDataSet = DataSet;
    mContext = context;
}

public static class ViewHolder extends RecyclerView.ViewHolder{
    public TextView mTextView;
    public LinearLayout mLinearLayout;
    public ViewHolder(View v){
        super(v);
        mTextView = (TextView) v.findViewById(R.id.tv);
        mLinearLayout = (LinearLayout) v.findViewById(R.id.ll);
    }
}

@Override
public AnimalsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
    // Create a new View
    View v = LayoutInflater.from(mContext).inflate(R.layout.custom_view,parent,false);
    ViewHolder vh = new ViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position){
    holder.mTextView.setText(mDataSet[position]);
    // Generate a random color
    int color = getRandomHSVColor();

    // Set a random color for TextView background
    holder.mTextView.setBackgroundColor(getLighterColor(color));

    // Set a text color for TextView
    holder.mTextView.setTextColor(getReverseColor(color));

    // Set a gradient background for LinearLayout
    holder.mLinearLayout.setBackground(getGradientDrawable());

    // Emboss the TextView text
    applyEmbossMaskFilter(holder.mTextView);
}

@Override
public int getItemCount(){
    return mDataSet.length;
}

// Custom method to apply emboss mask filter to TextView
protected void applyEmbossMaskFilter(TextView tv){
    EmbossMaskFilter embossFilter = new EmbossMaskFilter(
            new float[]{1f, 5f, 1f}, // direction of the light source
            0.8f, // ambient light between 0 to 1
            8, // specular highlights
            7f // blur before applying lighting
    );
    tv.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
    tv.getPaint().setMaskFilter(embossFilter);
}

// Custom method to generate random HSV color
protected int getRandomHSVColor(){
    // Generate a random hue value between 0 to 360
    int hue = mRandom.nextInt(361);
    // We make the color depth full
    float saturation = 1.0f;
    // We make a full bright color
    float value = 1.0f;
    // We avoid color transparency
    int alpha = 255;
    // Finally, generate the color
    int color = Color.HSVToColor(alpha, new float[]{hue, saturation, value});
    // Return the color
    return color;
}

// Custom method to create a GradientDrawable object
protected GradientDrawable getGradientDrawable(){
    GradientDrawable gradient = new GradientDrawable();
    gradient.setGradientType(GradientDrawable.SWEEP_GRADIENT);
    gradient.setColors(new int[]{getRandomHSVColor(), getRandomHSVColor(),getRandomHSVColor()});
    return gradient;
}

// Custom method to get a darker color
protected int getDarkerColor(int color){
    float[] hsv = new float[3];
    Color.colorToHSV(color, hsv);
    hsv[2] = 0.8f *hsv[2];
    return Color.HSVToColor(hsv);
}

// Custom method to get a lighter color
protected int getLighterColor(int color){
    float[] hsv = new float[3];
    Color.colorToHSV(color,hsv);
    hsv[2] = 0.2f + 0.8f * hsv[2];
    return Color.HSVToColor(hsv);
}

// Custom method to get reverse color
protected int getReverseColor(int color){
    float[] hsv = new float[3];
    Color.RGBToHSV(
            Color.red(color), // Red value
            Color.green(color), // Green value
            Color.blue(color), // Blue value
            hsv
    );
    hsv[0] = (hsv[0] + 180) % 360;
    return Color.HSVToColor(hsv);
}

}

build.gradle [dependencies]

implementation 'com.android.support:recyclerview-v7:28.0.0'

implementation 'com.android.support:cardview-v7:28.0.0'

You will get the following result

In this case you should adjust your view to show how you want the buttons

    
answered by 27.12.2018 в 20:06
-1

Remember that you can only have a View within a ScrollView regardless of the desired orientation.

What I would do would be to use something like the following:

<ScrollView> 
  <LinearLayout>
    <RelativeLayout>
     // aqui todos tus items que quieras utilizar para interactuar 
    <RelativeLayout/>
  <LinearLayout/>
<ScrollView/>

Obviously filling your configurations to what you need, if you are going to have very interactive things I would recommend you to go more advanced and separate it into fragments.

    
answered by 18.12.2018 в 20:27