我有三个水平方向的线性布局。在这三个视图里面放置了它的3X3视图网格。 layout xml如下
<?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>
我想将view_10移动到view_12如何实现?基本上需要垂直和水平滑动任何视图并保持填充视图状态。
答案 0 :(得分:1)
这个答案可能会对你有所帮助。我认为使用网格布局管理器的recyclerview可以更好地执行此任务。从循环视图中,您可以滑动视图并进行交换。
首先将回收视图和卡片视图的依赖关系添加到构建gradle
compile 'com.android.support:recyclerview-v7:25+'
compile 'com.android.support:cardview-v7:25+'
根据项目SDK版本添加依赖项,我有25个,所以我添加了25 +
现在创建活动
公共类MainActivity扩展AppCompatActivity { private Context 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
}
为班级创建布局。将recyclerview添加到主布局
<?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>
然后为网格custom_view.xml添加carview,此卡片视图充当网格的项目。
<?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 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;
}
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方法中捕捉滑动动作并执行动作,编写代码以更改那里的carview位置,你可以调用该帖子上的适配器并更改适配器卡,使用notify ..方法重新刷新适配器。有关详细信息,请参阅RecylerView文档和RecylerView adaptor文档。
干杯!!!