当前位置: 编程技术>移动开发
本页文章导读:
▪2013.11.07 ——— java线程之CLH行列锁 2013.11.07 ——— java线程之CLH队列锁
2013.11.07 ——— java线程之CLH队列锁参考:http://blog.csdn.net/aesop_wubo/article/details/7533186详细解释 见上面的链接,例子如下:package com.lp.lock;
public interface Lo.........
▪ sencha > 轮播图 数量在contrl 统制 sencha > 轮播图 数量在contrl 控制
countrl
photoListTap: function(list, index, node, record) {
if (!this.photoShow) {
this.photoShow = Ext.create('Sencha.view.PhotoShow');
}
var t_id = list.getS.........
▪ 图片的拖拽跟缩放 图片的拖拽和缩放
图片的拖拽很基础也很实用,很多地方用到,直接上干货。MainActivity.java:package com.example.dragzoom;
import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
im.........
[1]2013.11.07 ——— java线程之CLH行列锁
来源: 互联网 发布时间: 2014-02-18
2013.11.07 ——— java线程之CLH队列锁
2013.11.07 ——— java线程之CLH队列锁
参考:http://blog.csdn.net/aesop_wubo/article/details/7533186
详细解释 见上面的链接,例子如下:
2013.11.07 ——— java线程之CLH队列锁
参考:http://blog.csdn.net/aesop_wubo/article/details/7533186
详细解释 见上面的链接,例子如下:
package com.lp.lock;
public interface Lock {
void lock();
void unLock();
}
package com.lp.lock;
public class QNode {
public volatile boolean locked;
}
package com.lp.lock.clh;
import java.util.concurrent.atomic.AtomicReference;
import com.lp.lock.Lock;
import com.lp.lock.QNode;
public class CLHLock implements Lock{
AtomicReference<QNode> tail = new AtomicReference<QNode>(new QNode());//
ThreadLocal<QNode> mPre;//当前线程的前一个qnode
ThreadLocal<QNode> mNode;//当前线程的当前的qnode
public CLHLock(){
tail = new AtomicReference<QNode>(new QNode());
mNode = new ThreadLocal<QNode>(){
@Override
protected QNode initialValue() {
return new QNode();
}
};
mPre = new ThreadLocal<QNode>(){
@Override
protected QNode initialValue() {
return null;
}
};
}
/**
*
*/
@Override
public void lock() {
QNode lNode = mNode.get();//得到当前线程的qnode
lNode.locked = true;//设置为true 告诉其他线程 我准备获得锁
QNode pNode = tail.getAndSet(lNode);//得到前一个获得锁的qnode 并将tail设置我当前qnode,这样下一个线程就会等待本线程释放锁之后 才会执行 形成了队列 己成为队列的尾部
mPre.set(pNode);
while(pNode.locked){//等待前一个获得锁的线程释放锁
// System.out.println(Thread.currentThread().getName());
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
}
}
@Override
public void unLock() {
QNode lNode = mNode.get();//得到当前线程的qnode
lNode.locked = false;//设置为false 告诉其他线程 我释放了锁
mNode.set(mPre.get());//移除本节点
}
}
package com.lp.lock.clh;
import com.lp.lock.Lock;
public class TestCLHLock {
public static void main(String[] args) {
final Kfc kfc = new Kfc();
for(int i=0;i<10;i++){
new Thread("eat" + i){
public void run() {
while(true){
kfc.eat();
}
}
}.start();
}
}
}
class Kfc{
private final Lock lock = new CLHLock();
private int i = 0;
public void eat(){
try {
lock.lock();
System.out.println(Thread.currentThread().getName() + ": " + --i);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.unLock();
}
}
public void cook(){
try {
lock.lock();
System.out.println(Thread.currentThread().getName() + ": " + ++i);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.unLock();
}
}
}
[2] sencha > 轮播图 数量在contrl 统制
来源: 互联网 发布时间: 2014-02-18
sencha > 轮播图 数量在contrl 控制
countrl
photoListTap: function(list, index, node, record) {
if (!this.photoShow) {
this.photoShow = Ext.create('Sencha.view.PhotoShow');
}
var t_id = list.getStore().getAt(index).get('t_id');
this.showPhoto(t_id,this.photoShow);
this.getPhotoCard().push(this.photoShow);
},
showPhoto: function(t_id,pt){
//操作store
var photoShowST = Ext.getStore('PhotoShowST');
photoShowST.getProxy().setExtraParam('t_id', t_id);
photoShowST.load();
//\
//操作photoView
var count = photoShowST.getAt(0).get('photo_count');
var myitems = [];
for(j=0;j<=count;j++){
myitems.push(
{xtype: 'image',src: 'http://www.sencha.com/assets/images/sencha-avatar-64x64.png'}
);
}
pt.setItems(myitems);
},
view:
Ext.define('Sencha.view.PhotoShow', {
extend: 'Ext.Carousel',
xtype: 'photo_show_xx',
config:
{
directionLock: true,
direction: 'horizontal',
}
});
[3] 图片的拖拽跟缩放
来源: 互联网 发布时间: 2014-02-18
图片的拖拽和缩放
图片的拖拽很基础也很实用,很多地方用到,直接上干货。
MainActivity.java:
layout_main.xml:
ps:如果有错误希望不吝赐教。
图片的拖拽很基础也很实用,很多地方用到,直接上干货。
MainActivity.java:
package com.example.dragzoom;
import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
/**
*
* @author Zls
*实现图片的拖拽和缩放,给图片添加onClickListener
*/
public class MainActivity extends Activity {
private ImageView image;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = (ImageView) this.findViewById(R.id.image);
image.setOnTouchListener(new MyTouchListener());
}
public final class MyTouchListener implements OnTouchListener {
private int mode = 0; //三种模式表示触摸类型
private static final int DRAG = 1;
private static final int ZOOM = 2;
private PointF startpPoint = new PointF(), midPoint; //startPoint用来记录拖拽的时候记录第一次拖拽的点,midPoint让图片缩放的时候不移动
private float startDis, endDis; //两者之比表示缩放比例
private Matrix oldMatrix = new Matrix(), newMatrix = new Matrix(); //两个矩阵
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: //单手指按下表示为拖拽
mode = DRAG;
oldMatrix.set(image.getImageMatrix());
startpPoint.set(event.getX(), event.getY());
break;
case MotionEvent.ACTION_MOVE: // 手指在屏幕移动,该 事件会不断地触发
if (mode == DRAG) {
float dx = event.getX() - startpPoint.x; // 得到在x轴的移动距离
float dy = event.getY() - startpPoint.y; // 得到在y轴的移动距离
newMatrix.set(oldMatrix); // 在没有进行移动之前的位置基础上进行移动
newMatrix.postTranslate(dx, dy);
} else if (mode == ZOOM) { // 缩放
endDis = countDis(event); // 结束距离
if (endDis > 10f) {
float scale = endDis / startDis; // 得到缩放倍数
newMatrix.set(oldMatrix);
newMatrix.postScale(scale, scale, midPoint.x, //应用缩放
midPoint.y);
}
}
break;
case MotionEvent.ACTION_UP: //单手指或多手指抬起都恢复初始状态
case MotionEvent.ACTION_POINTER_UP:
mode = 0;
break;
case MotionEvent.ACTION_POINTER_DOWN: //多手指按下
mode = ZOOM;
startDis = countDis(event);
if (startDis > 10f) {
midPoint = midPoint(event);
}
break;
}
image.setImageMatrix(newMatrix); //让image显示最新的矩阵位置和大小,不执行则以上的触摸事件就无效鸟
return true;
}
}
private static PointF midPoint(MotionEvent event) {
float dx = (event.getX(1) + event.getX(0)) / 2;
float dy = (event.getY(1) + event.getY(0)) / 2;
return new PointF(dx, dy);
}
//
private static float countDis(MotionEvent event) {
float a = event.getX(1) - event.getX(0);
float b = event.getY(1) - event.getY(0);
float c = (float) Math.sqrt(a * a + b * b);
return c;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
layout_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
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=".MainActivity" >
<ImageView
android:id="@+id/image"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="matrix"
android:src="/blog_article/@drawable/luobing/index.html"/>
</RelativeLayout>
ps:如果有错误希望不吝赐教。
最新技术文章: