脸萌6

来源:互联网 发布:8051 单片机有哪些 编辑:程序博客网 时间:2024/06/05 00:28

今天是学习脸萌 的第七天  也是马上离开长沙的倒数第二天  

废话还是不说那么多  继续贴贴今天的笔记  整理下  今天的学习的思路

主界面

mainactivity     1 初始化绘图           initDraw();性别界面  以及对应的监听   (   myview加载图形大小,位置)   

2 初始化顶部tab initTab();       

3 初始化viewpager      initViewPager();

4 初始化光标(cursor) initCursor();

5初始化水平滑动条     initHsv();

6 初始化按钮            initButton();

myfragmen

7 从外界获取 性别 以及 图片序号 以及接口


mainactivity

package com.example.android160620;


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;


import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.HorizontalScrollView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.RelativeLayout;
import android.widget.TextView;


import com.example.android160620.fragment.MyFragment;
import com.example.android160620.view.MyView;


public class MainActivity extends FragmentActivity {


private RadioGroup group; 
//viewpager
private ViewPager viewPager;
//适配器
private MyAdapter adapter;
//游标
private TextView cursorView;
//水平滑动条
private HorizontalScrollView hsv;
//单选按钮
private RadioButton radioButton;
//包含绘图控件的布局
private RelativeLayout rl;

private boolean sex;
//绘制view
private MyView view;
//保存按钮
private Button saveBtn;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 去掉title栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);

Intent intent = getIntent();
sex = intent.getBooleanExtra("sex", true);


//初始化绘图
initDraw();
//初始化顶部tab
initTab();

//初始化viewpager
initViewPager();
//初始化
initCursor();
//初始化水平滑动条
initHsv();
//初始化按钮
initButton();
}


private void initButton() {
saveBtn = (Button) findViewById(R.id.save_btn);
saveBtn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {

//获取正在绘制的图片缓存
Bitmap bitmap = view.getDrawingCache();

//获取本地sd卡根目录
File root = Environment.getExternalStorageDirectory();
File file = new File(root, "lianmeng.png");

try {
//将图片写入本地
bitmap.compress(CompressFormat.PNG , 100, new FileOutputStream(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
}


}
});

}


// /**
// * 初始化绘图
// */
private void initDraw() {
rl = (RelativeLayout) findViewById(R.id.rl);

view = new MyView(this, sex);
//将绘图添加打牌布局中
rl.addView(view);
}


private void initHsv() {


hsv = (HorizontalScrollView) findViewById(R.id.hsv);

// hsv.scrollTo(x, 0)
}


private void initCursor() {


cursorView = (TextView) findViewById(R.id.cursor_tv);
}


private void initTab() {
radioButton = (RadioButton) findViewById(R.id.rb1);
group = (RadioGroup) findViewById(R.id.radiogroup);
group.setOnCheckedChangeListener(new OnCheckedChangeListener() {

@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {

switch(checkedId) {
case R.id.rb1:
viewPager.setCurrentItem(0);
break;
case R.id.rb2:
viewPager.setCurrentItem(1);
break;
case R.id.rb3:
viewPager.setCurrentItem(2);
break;
case R.id.rb4:
viewPager.setCurrentItem(3);
break;
case R.id.rb5:
viewPager.setCurrentItem(4);
break;
case R.id.rb6:
viewPager.setCurrentItem(5);
break;
case R.id.rb7:
viewPager.setCurrentItem(6);
break;
case R.id.rb8:
viewPager.setCurrentItem(7);
break;
case R.id.rb9:
viewPager.setCurrentItem(8);
break;
case R.id.rb10:
viewPager.setCurrentItem(9);
break;
case R.id.rb11:
viewPager.setCurrentItem(10);
break;
case R.id.rb12:
viewPager.setCurrentItem(11);
break;
}

}
});
}

private void initViewPager() {

//1、获取控件
viewPager = (ViewPager) findViewById(R.id.viewpager);
//创建数据源
//2、获取数据源

//3、创建适配器
//获取fragment的管理类
FragmentManager manager = getSupportFragmentManager();
adapter = new MyAdapter(manager);
//4、设置配齐
viewPager.setAdapter(adapter);

viewPager.setOnPageChangeListener(new OnPageChangeListener() {

/**
* 选中某个page
*/
@Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub

}
//
// /**
// * 当viewpager滑动过程中触发的事件
// * position 当前的位置
// * positionOffset 当前滑动的比例
// * positionOffsetPixels 当前滑动的像素
// */
// @Override

public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
//获取一个tab的宽度
int width = radioButton.getWidth();
//计算新的scrollview华东的位置
int newPos = (int) (position * width + positionOffset * width);

int center = (viewPager.getWidth() - width) / 2; 

//控制水平滑动条的移动
hsv.scrollTo(newPos - center, 0);

//控制游标移动
startMoveCursor(position, positionOffset);


}

/**
* 当viewpager状态改变的时候触发事件
*/
@Override
public void onPageScrollStateChanged(int state) {
// TODO Auto-generated method stub

}
});

}


private int from = 0;
/**
* 控制游标移动
* @param position       当前移动的位置
* @param positionOffset 当前移动的百分比
*/
protected void startMoveCursor(int position, float positionOffset) {
//获取当前被选中的radiobutton
RadioButton rb = (RadioButton) group.getChildAt(position);
//定义两个长度的数组 0下标 代表x坐标  1下标y坐标
int[] location = new int[2];
//获取当前radiobutton的坐标
rb.getLocationInWindow(location);

//计算移动后的坐标
int to = (int) (location[0] + positionOffset * rb.getWidth());

//创建动画
TranslateAnimation ta = new TranslateAnimation(
from, 
to, 
0, 
0);
ta.setDuration(100);
//动画完成以后停留在当前结束的位置
ta.setFillAfter(true);

cursorView.startAnimation(ta);
from = to;

}





private class MyAdapter extends FragmentPagerAdapter {
/**

* @param fm fragment的管理类
*/
public MyAdapter(FragmentManager fm) {
super(fm);
}


@Override
public Fragment getItem(int position) {

MyFragment fragment = new MyFragment();
//创建一个bundle对象,用于传递数据
Bundle bundle = new Bundle();
bundle.putInt("index", position);
bundle.putBoolean("sex", sex);
//设置参数
fragment.setArguments(bundle);
//添加监听
fragment.setIOnClickListener(view);

return fragment;
}


@Override
public int getCount() {
return 12;
}

}
}

 myview


package com.example.android160620.view;


import com.example.android160620.R;
import com.example.android160620.listener.IOnClickListener;
import com.example.android160620.util.ResourceUtils;


import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;


public class MyView extends View implements IOnClickListener{


/**
* 1、画笔  Paint
* 2、画布  Canvas
* @param context
*/
private Paint paint;
//myview的宽和高
private int width, height;
//性别
private boolean sex;

private ResourceUtils resourceUtils = new ResourceUtils();

//图片资源
private Bitmap bmp[];
private int res[];


public MyView(Context context, boolean sex) {
super(context);
this.sex = sex;

initPaint();

initBitmaps();

//允许获得绘制的图片
this.setDrawingCacheEnabled(true);
}




private void initBitmaps() {

if(sex) {
//sex true 是男生默认图
res = resourceUtils.getBoyDefault();
} else {
res = resourceUtils.getGirlDefault();
}


}


private void getBitmaps() {
//创建图片数组
bmp = new Bitmap[res.length];

for (int i = 0; i < res.length; i++) {
bmp[i] = BitmapFactory.decodeResource(getResources(), res[i]);
}
//获得合适大小的图片
//蒋思  大小
bmp[0] = Bitmap.createScaledBitmap(bmp[0], 2*width/3, 2*width/3, false);
bmp[1] = Bitmap.createScaledBitmap(bmp[1], 2*width/3, 2*width/3, false);
bmp[2] = Bitmap.createScaledBitmap(bmp[2], width/3, width/3, false);
bmp[3] = Bitmap.createScaledBitmap(bmp[3], 3*width/10, 3*width/10, false);
bmp[4] = Bitmap.createScaledBitmap(bmp[4], width/5, width/5, false);
bmp[5] = Bitmap.createScaledBitmap(bmp[5], width/2,width/2, false);
bmp[6] = Bitmap.createScaledBitmap(bmp[6], width/3, width/3, false);
bmp[7] = Bitmap.createScaledBitmap(bmp[7], 5*width/11, 5*width/11, false);
bmp[10] = Bitmap.createScaledBitmap(bmp[10], width, height, false);

}




private void initPaint() {
/**
* paint只负责绘制的样式
*/
paint = new Paint();
paint.setColor(Color.RED);
//平滑曲线
paint.setAntiAlias(true);
}


@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

if(width == 0) {
width = this.getWidth();
height = this.getHeight();
}
// 位置
//通过id获取所有的资源图片
getBitmaps();
//根据图层顺序绘制图片
//先画背景
canvas.drawBitmap(bmp[10], 0,0, null);
//再绘制五官
canvas.drawBitmap(bmp[1],(width-bmp[1].getWidth())/2, (height-bmp[1].getHeight())/2, null);
canvas.drawBitmap(bmp[2],(width-bmp[2].getWidth())/2, (height-bmp[2].getHeight())/2, null);
canvas.drawBitmap(bmp[3],(width-bmp[3].getWidth())/2, (height-bmp[2].getHeight())/2+height/15, null);
canvas.drawBitmap(bmp[4],(width-bmp[4].getWidth())/2, 11*height/20, null);
canvas.drawBitmap(bmp[5],(width-bmp[5].getWidth())/2, (height-bmp[5].getHeight())/2, null);
canvas.drawBitmap(bmp[6],(width-bmp[6].getWidth())/2, (height-bmp[6].getHeight())/2+height/20, null);
canvas.drawBitmap(bmp[7],(width-bmp[7].getWidth())/2, height-bmp[7].getHeight(),null);
//最后绘制发型,画在控件中心位置
canvas.drawBitmap(bmp[0],(width-bmp[0].getWidth())/2, (height-bmp[0].getHeight())/2, null);

}




@Override
public void onClick(int index, int resId) {

res[index] = resId;
//刷新
invalidate();
}

}


myframent

package com.example.android160620.fragment;


import java.util.ArrayList;
import java.util.List;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;


import com.example.android160620.R;
import com.example.android160620.adapter.MyAdapter;
import com.example.android160620.listener.IOnClickListener;
import com.example.android160620.util.ResourceUtils;




public class MyFragment extends Fragment{


private View view;

private int index;
private boolean sex;


//===================gridview 初始化======================
private GridView gridView;
//数据源
private List<Integer> dataList = new ArrayList<Integer>();

private MyAdapter adapter;
//===================gridview 初始化======================

/**
* 创建fragment布局
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

view = inflater.inflate(R.layout.layout_fragment, container, false);

return view;
}


/**
* 和当前fragment关联的activity的oncreate方法调用完成以后,执行的方法
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);

Bundle bundle = this.getArguments();
index = bundle.getInt("index");
sex = bundle.getBoolean("sex");

initGridView();
}


private void initGridView() {
//1、获取控件
gridView = (GridView) view.findViewById(R.id.gridview);

//2、获取数据源
getData();

//3、创建适配器:将数据源和视图(控件)绑定到一起
adapter = new MyAdapter(dataList, getActivity());

//4、将适配器绑定到gridview中
gridView.setAdapter(adapter);

gridView.setOnItemClickListener(new OnItemClickListener() {


@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {

if(onClickListener != null) {
//传递当前选择的类型,和资源id
onClickListener.onClick(index, dataList.get(position));
}
}
});
}




/**

*/
private void getData() {

int res[] = null;
switch(index) {
case 0:
//发型
if(sex) {
res = ResourceUtils.getRealBoyHair();
} else {
res = ResourceUtils.getRealGirlHair();
}
break;
case 1:
//脸型
res = ResourceUtils.getFaceShape();
break;
case 2:
//眉毛
res = ResourceUtils.getEyeBrow();

break;
case 3:
//眼睛
res = ResourceUtils.getEye();
break;
case 4:
//嘴巴
res = ResourceUtils.getMouth();
break;
case 5:
//特征
if(sex) {
res = ResourceUtils.getRealBoyFeature();
} else {
res = ResourceUtils.getGirlFeature();
}
 
break;
case 6:
//眼镜
res = ResourceUtils.getGlass();
break;
case 7:
//衣服
if(sex) {
res = ResourceUtils.getBoyClothes();
} else {
res = ResourceUtils.getGirlClothes();
}

break;
case 8:
//帽子
res = ResourceUtils.getHat();
break;
case 9:
//爱好
res = ResourceUtils.getHobby();
break;
case 10:
//背景
res = ResourceUtils.getBackGround();
break;
case 11:
//气泡
res = ResourceUtils.getPop();
break;
}

//jiang
for (int i = 0; i < res.length; i++) {
dataList.add(res[i]);
}

}


/**
* 让外部传入接口对象
*/
private IOnClickListener onClickListener;
public void setIOnClickListener(IOnClickListener onClickListener) {
this.onClickListener = onClickListener;
}


}


重要的三块 代码  

不过还是贴上上课写的笔记吧

图形绘制


实现每次更新


每一次界面变化都要刷新
View
静态图片(不需要主动刷新的绘制内容)


五子棋 象棋  围棋
主线程中更新界面


surfaceaview
动态界面(在线程中主动刷新)


飞机大战  坦克大战




优势 双缓冲机制
在线程中刷新界面、
context  添加到某个界面


查找??!


实现图层变化
gridview获取类型  图片id


传送给(myview)myfragment 给 myview
(多态回调)

整体过程:
分割
绘图片
监听换图层(图层变化,更新)

加油!所有人


0 0