2017-02-01 18 views
2

私は水平方向に3つの線形レイアウトを持っています。その3つのビューの中には、その種類の3X3グリッドが配置されています。私はそれを達成する方法をview_12するview_10移動したいビューを1つのビューから別のビューにスライドする方法

<?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/activity_main" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:background="@android:color/darker_gray" 
    android:gravity="center" 
    android:orientation="vertical"> 

    <LinearLayout 
     android:id="@+id/ll_h1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

     <View 
      android:id="@+id/view_00" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_margin="5dp" 
      android:background="@drawable/round_rectangle_bg" /> 

     <View 
      android:id="@+id/view_01" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_margin="5dp" 
      android:background="@drawable/round_rectangle_bg" /> 

     <View 
      android:id="@+id/view_02" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_margin="5dp" 
      android:background="@drawable/round_rectangle_bg" /> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/ll_h2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

     <View 
      android:id="@+id/view_10" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_margin="5dp" 
      android:background="@drawable/round_rectangle_bg_filled" /> 

     <View 
      android:id="@+id/view_11" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_margin="5dp" 
      android:background="@drawable/round_rectangle_bg" /> 

     <View 
      android:id="@+id/view_12" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_margin="5dp" 
      android:background="@drawable/round_rectangle_bg" /> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/ll_h3" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

     <View 
      android:id="@+id/view_20" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_margin="5dp" 
      android:background="@drawable/round_rectangle_bg" /> 

     <View 
      android:id="@+id/view_21" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_margin="5dp" 
      android:background="@drawable/round_rectangle_bg" /> 

     <View 
      android:id="@+id/view_22" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_margin="5dp" 
      android:background="@drawable/round_rectangle_bg" /> 
    </LinearLayout> 
</LinearLayout> 

を次のようにレイアウトXMLがある??任意のビューを垂直方向および水平方向にスライドさせ、塗りつぶしたビュー状態を維持する必要があります。

+0

あなたの予想される出力を共有してください –

+0

水平スライドに[View Pager'](https://developer.android.com/reference/android/support/v4/view/ViewPager.html)を使用してみませんか? –

答えて

1

この回答はお役に立ちます。私はグリッドレイアウトマネージャーを備えたrecyclerviewを使ってこのタスクを実行する方がよいと思います。リサイクルビューからは、ビューをスワイプして、それらを交換することができます。

すべての最初のビルドのGradleにリサイクルビューとカードビューの依存関係を追加

compile 'com.android.support:recyclerview-v7:25+' 
compile 'com.android.support:cardview-v7:25+' 

私は+

をadded25持つように、プロジェクトのSDKのバージョンに応じて、私は25を持っている依存関係を追加します。今アクティビティを作成します。

public class MainActivity extends AppCompatActivity { プライベートコンテキストmContext;

RelativeLayout mRelativeLayout; 
private RecyclerView mRecyclerView; 

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

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

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

    // Get the widgets reference from XML layout 
    mRelativeLayout = (RelativeLayout) findViewById(R.id.activity_main); 
    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); 

    setUpItemTouchHelper(); // this method is use to swipe views 
} 

クラスのレイアウトを作成します。そして、グリッドのアイテムとして、グリッドcustom_view.xmlためにこのカードビューの行為をカービューの追加メインレイアウト

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.crowderia.myapplication.MainActivity"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recycler_view" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:scrollbars="vertical" 
     > 
    </android.support.v7.widget.RecyclerView> 
</RelativeLayout> 

にrecyclerviewを追加します。

<?xml version="1.0" encoding="utf-8"?> 
<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> 
</android.support.v7.widget.CardView> 

gridlayout用のアダプタを作成します。

public class AnimalsAdapter extends RecyclerView.Adapter<AnimalsAdapter.ViewHolder>{ 

private String[] mDataSet; 
private Context mContext; 
private Random mRandom = new Random(); 

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

@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]); 

//ランダム色 INT色= 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; 
} 

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

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

そして最も重要な部分は、OnItemTouchHelperメソッドです。メインアクティビティにメソッドを作成し、このコードをコピーします。

ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT|ItemTouchHelper.UP|ItemTouchHelper.DOWN) { 

      // not important, we don't want drag & drop 
      @Override 
      public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
       return false; 
      } 


      @Override 
      public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 
       int position = viewHolder.getAdapterPosition(); 
       AnimalsAdapter mAdapter = (AnimalsAdapter) recyclerView.getAdapter(); 
       return super.getSwipeDirs(recyclerView, viewHolder); 
      } 

      @Override 
      public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) { 
       int swipedPosition = viewHolder.getAdapterPosition(); 
       AnimalsAdapter mAdapter = (AnimalsAdapter) mRecyclerView.getAdapter(); 
       if (swipeDir == ItemTouchHelper.LEFT){ 
//     mAdapter.pendingRemoval(swipedPosition); 
       } else if (swipeDir == ItemTouchHelper.UP){ 
//     mAdapter.pendingAccept(swipedPosition); 
       } 
      } 

      @Override 
      public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { 
       View itemView = viewHolder.itemView; 

       // not sure why, but this method get's called for viewholder that are already swiped away 
       if (viewHolder.getAdapterPosition() == -1) { 
        // not interested in those 
        return; 
       } 



       super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); 
      } 
     }; 
     ItemTouchHelper mItemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback); 
     mItemTouchHelper.attachToRecyclerView(mRecyclerView); 

あなたはonSwiped方法でスワイプアクションをキャッチし、アクションを実行し、そこカービューの位置を変更するためにコードを書くことができ、あなたはそのpostition上のアダプタおよびアダプタカードを変更、使用を通知するために呼び出すことができます。..方法へアダプタをリフレッシュします。詳細については、RecylerViewのドキュメントとRecylerView adaptorのドキュメントを参照してください。

乾杯!

関連する問題