1.view
package com.example.administrator.zkmn3; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.View; public class CireleView extends View { private int radius; public CireleView(Context context) { super(context); } public CireleView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CireleView); for (int i = 0; i <typedArray.length() ; i++) { int index = typedArray.getIndex(i); switch (i){ case R.styleable.CireleView_radius: radius = typedArray.getInt(index, 20); break; case R.styleable.CireleView_color: typedArray.getColor(index,Color.GREEN); break; } } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(getMeasuredWidth(widthMeasureSpec),getMeasuredHeight(heightMeasureSpec)); } private int getMeasuredHeight(int heightMeasureSpec) { int mode = MeasureSpec.getMode(heightMeasureSpec); int size = MeasureSpec.getSize(heightMeasureSpec); int result=0; if (mode==MeasureSpec.AT_MOST){ result=getPaddingTop()+getPaddingBottom()+2*radius; }else if (mode==MeasureSpec.EXACTLY){ result =size; } return result; } private int getMeasuredWidth(int widthMeasureSpec) { int mode = MeasureSpec.getMode(widthMeasureSpec); int size = MeasureSpec.getSize(widthMeasureSpec); int result=0; if (mode==MeasureSpec.AT_MOST){ result=getPaddingLeft()+getPaddingRight()+2*radius; }else if (mode==MeasureSpec.EXACTLY){ result =size; } return result; } //@SuppressLint("DrawAllocation") @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); paint.setColor(Color.RED); paint.setAntiAlias(true); canvas.drawCircle(radius,radius,radius,paint); } }
2.动画设置
?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:propertyName="alpha" android:valueFrom="0" android:valueTo="100dp" ></objectAnimator> </set>
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:propertyName="rotationX" android:valueFrom="0" android:valueTo="100dp" ></objectAnimator> </set>
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:propertyName="scaleX" android:valueFrom="0" android:valueTo="100dp" ></objectAnimator> </set>
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:propertyName="translationX" android:valueFrom="0" android:valueTo="100dp" ></objectAnimator> </set>
写完这四个之后 建立一个动画集 然后把这四个复制到里面 animator_set
3.动画点击页面
package com.example.administrator.zkmn3; import android.animation.Animator; import android.animation.AnimatorInflater; import android.content.Context; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import com.example.administrator.zkmn3.ui.LoginActivity; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private CireleView cv_circle; private Button btn_translate; private Button btn_scale; private Button btn_rotate; private Button btn_alpha; private Button btn_animator_set; private Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cv_circle = findViewById(R.id.cv_circle); btn_translate = findViewById(R.id.btn_translate); btn_scale = findViewById(R.id.btn_scale); btn_rotate = findViewById(R.id.btn_rotate); btn_alpha = findViewById(R.id.btn_alpha); btn_animator_set = findViewById(R.id.btn_animator_set); context = MainActivity.this; btn_translate.setOnClickListener(this); btn_scale.setOnClickListener(this); btn_rotate.setOnClickListener(this); btn_rotate.setOnClickListener(this); btn_alpha.setOnClickListener(this); btn_animator_set.setOnClickListener(this); cv_circle.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_translate: bindAnimator(R.animator.translate); break; case R.id.btn_scale: bindAnimator(R.animator.sacle); break; case R.id.btn_rotate: bindAnimator(R.animator.rotela); break; case R.id.btn_alpha: bindAnimator(R.animator.alpha); break; case R.id.btn_animator_set: bindAnimator(R.animator.set_animator); break; case R.id.cv_circle: startActivity(new Intent(this,LoginActivity.class)); break; } } private void bindAnimator(int animatorId) { Animator animator = AnimatorInflater.loadAnimator(context, animatorId); animator.setTarget(cv_circle); animator.start(); } }
4.友盟页面
package com.example.administrator.zkmn3.ui; import android.Manifest; import android.content.Context; import android.content.Intent; import android.os.Build; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.Toast; import com.example.administrator.zkmn3.R; import com.example.administrator.zkmn3.ShowActivity; import com.umeng.socialize.UMAuthListener; import com.umeng.socialize.UMShareAPI; import com.umeng.socialize.bean.SHARE_MEDIA; import java.util.Map; public class LoginActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_login; UMAuthListener authListener = new UMAuthListener() { /** * @desc 授权开始的回调 * @param platform 平台名称 */ @Override public void onStart(SHARE_MEDIA platform) { } /** * @desc 授权成功的回调 * @param platform 平台名称 * @param action 行为序号,开发者用不上 * @param data 用户资料返回 */ @Override public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) { String uid = data.get("uid"); String name = data.get("name"); String gender = data.get("gender"); String iconurl = data.get("iconurl"); Toast.makeText(context, "成功了"+uid+"..."+name+"..."+gender+"..."+iconurl, Toast.LENGTH_LONG).show(); Log.i("context","成功了"+uid+"..."+name+"..."+gender+"..."+iconurl); } /** * @desc 授权失败的回调 * @param platform 平台名称 * @param action 行为序号,开发者用不上 * @param t 错误原因 */ @Override public void onError(SHARE_MEDIA platform, int action, Throwable t) { Toast.makeText(context, "失败:" + t.getMessage(), Toast.LENGTH_LONG).show(); } /** * @desc 授权取消的回调 * @param platform 平台名称 * @param action 行为序号,开发者用不上 */ @Override public void onCancel(SHARE_MEDIA platform, int action) { Toast.makeText(context, "取消了", Toast.LENGTH_LONG).show(); } }; private Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); btn_login = findViewById(R.id.btn_login); context = LoginActivity.this; btn_login.setOnClickListener(this); if(Build.VERSION.SDK_INT>=23){ String[] mPermissionList = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.CALL_PHONE,Manifest.permission.READ_LOGS,Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.SET_DEBUG_APP,Manifest.permission.SYSTEM_ALERT_WINDOW,Manifest.permission.GET_ACCOUNTS,Manifest.permission.WRITE_APN_SETTINGS}; ActivityCompat.requestPermissions(this,mPermissionList,123); } } @Override public void onClick(View v) { UMShareAPI.get(this).getPlatformInfo(LoginActivity.this, SHARE_MEDIA.QQ, authListener); startActivity(new Intent(this,ShowActivity.class)); } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); UMShareAPI.get(this).onActivityResult(requestCode,resultCode,data); } }
5 App页面
package com.example.administrator.zkmn3.di; import android.app.Application; import com.umeng.commonsdk.UMConfigure; import com.umeng.socialize.PlatformConfig; public class App extends Application { @Override public void onCreate() { super.onCreate(); UMConfigure.init(this,"\n" +"5b7951a9f43e486f69000406" ,"umeng",UMConfigure.DEVICE_TYPE_PHONE,"");//58edcfeb310c93091c000be2 5965ee00734be40b580001a0 PlatformConfig.setWeixin("wxdc1e388c3822c80b", "3baf1193c85774b3fd9d18447d76cab0"); //豆瓣RENREN平台目前只能在服务器端配置 PlatformConfig.setSinaWeibo("3921700954", "04b48b094faeb16683c32669824ebdad","http://sns.whalecloud.com"); PlatformConfig.setYixin("yxc0614e80c9304c11b0391514d09f13bf"); PlatformConfig.setQQZone("100424468", "c7394704798a158208a74ab60104f0ba"); PlatformConfig.setTwitter("3aIN7fuF685MuZ7jtXkQxalyi", "MK6FEYG63eWcpDFgRYw4w9puJhzDl0tyuqWjZ3M7XJuuG7mMbO"); PlatformConfig.setAlipay("2015111700822536"); PlatformConfig.setLaiwang("laiwangd497e70d4", "d497e70d4c3e4efeab1381476bac4c5e"); PlatformConfig.setPinterest("1439206"); PlatformConfig.setKakao("e4f60e065048eb031e235c806b31c70f"); PlatformConfig.setDing("dingoalmlnohc0wggfedpk"); PlatformConfig.setVKontakte("5764965","5My6SNliAaLxEm3Lyd9J"); PlatformConfig.setDropbox("oz8v5apet3arcdy","h7p2pjbzkkxt02a"); } }
6.展示页面
package com.baway.alex.recyclerview_mutilpart_demo.ui.activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;
import com.baway.alex.recyclerview_mutilpart_demo.R;
import com.baway.alex.recyclerview_mutilpart_demo.data.beans.MutilpartBean;
import com.baway.alex.recyclerview_mutilpart_demo.ui.adapter.SubAdapter;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
@BindView(R.id.rv_container)
RecyclerView rvContainer;
//数据请求地址
public static final String URL_STRING = "http://www.xieast.com/api/news/news.php?page=1";
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
context = MainActivity.this;
//数据请求
requestData();
}
private void requestData() {
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
Request request = new Request.Builder().url(URL_STRING).build();
//开启请求
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
final String errorMsg = e.getMessage().toString();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, errorMsg, Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String responseString = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
Gson gson = new Gson();
MutilpartBean mutilpartBean = gson.fromJson(responseString, MutilpartBean.class);
List<MutilpartBean.DataBean> beanList = mutilpartBean.getData();
//布局管理器
LinearLayoutManager manager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false);
rvContainer.setLayoutManager(manager);
//创建适配器,传入所需内容
SubAdapter subAdapter = new SubAdapter(context, (ArrayList<MutilpartBean.DataBean>) beanList);
rvContainer.setAdapter(subAdapter);
}
});
}
});
}
}
7.适配器
package com.baway.alex.recyclerview_mutilpart_demo.ui.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.baway.alex.recyclerview_mutilpart_demo.R;
import com.baway.alex.recyclerview_mutilpart_demo.data.beans.MutilpartBean;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
//设置RecyclerView.ViewHolder作为泛型内容,使得ReccyclerView可以设置多种条目布局
public class SubAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
Context context;
ArrayList<MutilpartBean.DataBean> beanList;
public SubAdapter(Context context, ArrayList<MutilpartBean.DataBean> beanList) {
this.context = context;
this.beanList = beanList;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
//根据解析数据,明确是具体哪种填充视图
View rootView;
RecyclerView.ViewHolder holder;
if (beanList.get(position).getThumbnail_pic_s03() == null && beanList.get(position).getThumbnail_pic_s02() == null) {
//第一种填充的视图布局
rootView = LayoutInflater.from(context).inflate(R.layout.onepic_layout, viewGroup, false);
holder = new OnePicHolder(rootView);
} else if (beanList.get(position).getThumbnail_pic_s03() == null && beanList.get(position).getThumbnail_pic_s02() != null) {
//第二种填充的视图布局
rootView = LayoutInflater.from(context).inflate(R.layout.twopic_layout, viewGroup, false);
holder = new TwoPicHolder(rootView);
} else {
//第三种填充的视图布局
rootView = LayoutInflater.from(context).inflate(R.layout.threepic_layout, viewGroup, false);
holder = new ThreePicHolder(rootView);
}
return holder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
//具体绑定哪个ViewHolder对象
if (viewHolder instanceof OnePicHolder) {
//通过Picasso加载解析图片
Picasso.get().load(beanList.get(position).getThumbnail_pic_s()).into(((OnePicHolder) viewHolder).iv_firstItem);
} else if (viewHolder instanceof TwoPicHolder) {
Picasso.get().load(beanList.get(position).getThumbnail_pic_s()).into(((TwoPicHolder) viewHolder).iv_twoPic_firstItem);
Picasso.get().load(beanList.get(position).getThumbnail_pic_s02()).into(((TwoPicHolder) viewHolder).iv_twoPic_bottomItem);
} else {
Picasso.get().load(beanList.get(position).getThumbnail_pic_s()).into(((ThreePicHolder) viewHolder).iv_threePic_firstItem);
Picasso.get().load(beanList.get(position).getThumbnail_pic_s02()).into(((ThreePicHolder) viewHolder).iv_threePic_middleItem);
Picasso.get().load(beanList.get(position).getThumbnail_pic_s03()).into(((ThreePicHolder) viewHolder).iv_threePic_bottomItem);
}
}
@Override
public int getItemCount() {
return beanList.size();
}
class OnePicHolder extends RecyclerView.ViewHolder {
private ImageView iv_firstItem;
public OnePicHolder(@NonNull View itemView) {
super(itemView);
iv_firstItem = itemView.findViewById(R.id.iv_firstItem);
}
}
class TwoPicHolder extends RecyclerView.ViewHolder {
private ImageView iv_twoPic_firstItem;
private ImageView iv_twoPic_bottomItem;
public TwoPicHolder(@NonNull View itemView) {
super(itemView);
iv_twoPic_firstItem = itemView.findViewById(R.id.iv_twoPic_firstItem);
iv_twoPic_bottomItem = itemView.findViewById(R.id.iv_twoPic_bottomItem);
}
}
class ThreePicHolder extends RecyclerView.ViewHolder {
private ImageView iv_threePic_firstItem;
private ImageView iv_threePic_middleItem;
private ImageView iv_threePic_bottomItem;
public ThreePicHolder(@NonNull View itemView) {
super(itemView);
iv_threePic_firstItem = itemView.findViewById(R.id.iv_threePic_firstItem);
iv_threePic_middleItem = itemView.findViewById(R.id.iv_threePic_middleItem);
iv_threePic_bottomItem = itemView.findViewById(R.id.iv_threePic_bottomItem);
}
}
}
最后依赖
implementation 'com.android.support:design:27.+' implementation 'com.squareup.okhttp3:okhttp:3.11.0' implementation 'com.google.code.gson:gson:2.2.4' implementation 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' implementation 'com.squareup.picasso:picasso:2.71828' implementation files('libs/umeng-common-1.5.3.jar') implementation files('libs/umeng-share-core-6.9.3.jar') implementation files('libs/umeng-sharetool-6.9.3.jar') implementation files('libs/umeng-share-QQ-simplify-6.9.3.jar') implementation files('libs/umeng-shareboard-widget-6.9.3.jar')